Skip to content

使用手册

wxiang edited this page Oct 26, 2022 · 20 revisions

简介

TencentKona-8 支持以下特性:

  • Default CDS Archive 提高启动速度.
  • Java Flight Recorder 采集java应用程序的诊断信息.
  • Optimized Work Stealing Threads GC线程调度优化
  • G1 FullGC 并行化
  • G1GC 性能优化
  • 异步GC日志

Default CDS Archive

Tencent Kona 默认打开 Default CDS Archive 功能, 用户可以通过以下启动标志关闭该功能:

java -Xshare:off 

Java Flight Recorder (JFR)

Tencent Kona 默认关闭 JFR功能, 用户可通过以下步骤使用"

JFR 使用步骤

  • 使用以下标志启动java
java -XX:+FlightRecorder
  • 当应用程序运行时,使用以下命令采集JFR数据
  jcmd <your_pid> JFR.start name=<record_name> filename=<dump_file_name>.jfr 
  • 使用以下命令停止JFR采集:
  jcmd <your_pid> JFR.stop

JFR 数据处理

请使用 java mission control (jmc) 7.0以上版本打开*.jfr文件

了解更多

请参考Oracle的JFR官方文档。

GC线程调度优化 Optimized Work Stealing Threads

开启方式

  • 默认开启,在启动参数里面显示添加 -XX:-UseOWSTTaskTerminator关闭

原理

  • GC并行线程通过Work Stealing进行负载均衡,减少GC停顿时间。原有Work Stealing算法中所有空闲GC线程都会频繁尝试work stealing造成CPU资源浪费,新算法采用一个master线程监控是否进行work stealing并在适当时机唤醒其它空闲GC线程,极大减少CPU资源浪费和进程间的CPU资源竞争。OWST在OpenJDK社区版本12以后支持,大数据Hibench测试有最多30%的性能提升,平均提升8%。

G1 FullGC 并行化

开启方式

  • 在启动参数里面显示添加 -XX:+G1ParallelFullGC,这个参数默认是false。

原理

  • 官方OpenJDK8u中默认是G1 FullGC是单线程全停机的gc,在TencentKona8.0.4的版本发布的G1的FullGC并行化功能,可以部分阶段多线程执行gc,有效降低FullGC的停机时间,改善系统最坏情况下的性能。

G1性能优化

原理

  • 未来的CMS被社区放弃,因此G1 GC的优化成为社区最主要的工作,Tencent Kona JDK8持续进行一系列的G1 GC的性能优化。包括很多GC过程的并行化优化: 包括evacuation failure的一些过程的并行化,free collection set的并行化等。以及一系列的G1 GC算法细节的优化,具体详见一些代码仓库的commit log。

G1 Concurrent Remembered Set Rebuild支持

开启方式

  • 在启动参数里添加-XX:+G1RebuildRemSet, 该参数默认是false(不默认打开)。

原理

  • G1会一直维护老区的remembered set,这回带来很多的内存以及GC吞吐量的开销,在TencentKona8.0.5的版本之后,会在concurrent阶段重新rebuild老区的remembered set,降低G1GC的内存开销以及提升G1GC的吞吐量。

协程版本介绍

简介

  • KonaJDK参考社区Loom方案在Kona8中提供协程解决方案。
  • KonaJDK中提供了Java协程实现VirtualThread,相比Java线程线程切换快、占用内存少,在保持原有Java同步编程的模式的情况下,降低了线程创建、切换的开销,适用于高并发的业务场景。
  • KonaJDK8 提供协程VirtualThread是一个标准的Java/lang/Thread子类,支持Thread的绝大部分操作、线程工厂(ThreadFactory),可以方便地将现有的程序切换使用协程。
  • 用户代码层面主要使用的接口在java/lang/Thread、sun/misc/VirtualThreads中。VirtualThreads提供协程的挂起(park)、恢复(unpark)的操作接口,在调用前需要通过Thread.isVirtual()接口确定当前park/unpark的线程是否是协程。Thread提供了创建协程的API,协程操作的接口都直接复用了线程的接口,包括start、join、sleep、interrupt等。
  • 更多信息参考:https://github.com/Tencent/TencentKona-8/wiki/KonaFiber用户文档-292

选项

-XX:+/-UseKonaFiber控制打开、关闭协程功能(默认打开)

Application Class-Data Sharing

对Application class loader 加载的类支持Class-Data Sharing

使用方法:

Determining the classes to archive

java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst -cp hello.jar HelloWorld

Creating the AppCDS archive

java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa -cp hello.jar

Using the AppCDS archive

java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar HelloWorld

更多信息请参考 https://openjdk.java.net/jeps/310

Asynchronous GC logging

From JDK-8229517: Support for optional asynchronous/buffered logging.

Tencent Kona 默认关闭异步GC日志, 用户可通过以下步骤使用

java -XX:+UseAsyncGCLog

Cache and Restore C2 compilation code

介绍

通过对Java进程运行时编译的缓存机制,来减少后续同配置Java进程运行时编译开销; 约束: 支持通过bootstrap class loader,application class loader加载的类所包含的方法;不支持customer class loader加载的类; 支持从jar包读取的类,不支持从目录中读取的class

使用流程:

主参数:-XX:CodeReviveOptions=

Code Revive 推荐使用流程分为以下三步:

第一步:缓存运行时编译代码

将JIT编译器C2生成的native 代码,在进程结束时,缓存在指定的csa文件中;

开启命令:save

参数: -XX:CodeReviveOptions=save,file=<csa文件名>

第二步:合并多个缓存文件

将多个相同配置的缓存文件合并为一个文件,

开启命令:merge

参数: -XX:CodeReviveOptions=merge,file=<合并后的缓存文件>,input_files=<待合并文件> -XX:CodeReviveOptions=merge,file=<合并后的缓存文件>,input_list_file=<待合并文件列表>

第三步:使用缓存文件

Java应用加载缓存文件,JIT编译时使用缓存的native 代码;

开启命令:restore

参数: -XX:CodeReviveOptions=restore,file=<csa文件名>