JVM线程优化

原理

业务进程运行期间,JVM会开启回收线程进行即时编译和堆空间管理垃圾回收等操作,JVM运行线程数量对系统性能有直接影响。通过资源监控找到CPU占用率较高的JVM线程,并做相关调优处理,能优化业务程序运行性能。

通过下面方法找到占用CPU较高的JVM线程:

  1. 利用top命令找到Java进程ID,如此示例的进程ID是16498。

  2. 利用top -H -p <pid>命令跟踪进程下面各个线程的CPU占用情况,如下图取16810线程作为示例。

  3. 将线程ID转换成十六进制,可以使用Windows操作系统计算器转换,如16810转换为41aa。
  4. 使用jstack命令查询此线程栈信息:

    1
     jstack -l <进程ID> | grep <线程十六进制ID>
    

    可以看出此线程名称是"cronJobScheduler_Worker-8",这个不是JVM的线程。下图中"Gang worker#0 (Parallel GC Threads)"、"Concurrent Mark-Sweep GC Thread"、"Gang worker#1 (Parallel CMS Threads)"都属于JVM线程。

修改方式

  • 增加线程数量会导致CPU利用率上升,上下文切换增多可能会引起业务性能下降,调整参数需要根据业务实际情况进行优化适配。
  • 关闭JIT可能会对业务性能有影响。