业务进程运行期间,JVM会开启回收线程进行及时编译和堆空间管理垃圾回收等操作,JVM运行线程多少对系统性能有直接影响。通过资源监控找到占用CPU较高的JVM线程,并做相关调优处理,能优化业务程序运行性能。
通过下面方法找到占用CPU较高的JVM线程:
jstack -l <进程ID> | grep <线程16进制ID>
可以看出此线程名称是"cronJobScheduler_Worker-8",这个不是JVM的线程。下图中"Gang worker#0 (Parallel GC Threads)"、"Concurrent Mark-Sweep GC Thread"、"Gang worker#1 (Parallel CMS Threads)"都属于JVM线程。
下面是将CMS的GC线程数量设置成2的示例:
# /path/java -XX:ParallelCMSThreads=2 <other parameters>
# /path/java -XX:CompileThreshold=20000 <other parameters>
调整编译线程数量,设置-XX:+CICompilerCountPerCPU=true,编译线程数依赖于处理器核数自动配置;设置-XX:+CICompilerCountPerCPU=false -XX:+CICompilerCount=N,强制设定总编译线程数为N。例如,将JIT线程数量设置为4:
# /path/java -XX:+CICompilerCountPerCPU=false -XX:+CICompilerCount=4 <other parameters>