基于DevKit Java性能分析工具的调优实践——异常GC问题
发表于 2025/12/29
0
1 调优概述
鲲鹏DevKit是一款提供涵盖迁移、测试、性能调优及系统诊断等各环节的开发使能工具集。其中,DevKit Java性能分析工具是针对基于鲲鹏的服务器上运行的Java程序的性能分析和优化工具,能图形化显示Java程序的堆、线程、锁、垃圾回收等信息,收集热点函数、定位程序瓶颈点,帮助用户采取针对性优化。本文使用Java性能优化工具对运行中的Java程序进行在线分析和采样分析,找到程序中的异常GC问题,并根据分析结果进行优化修改,从而实现Java程序最佳运行。
2 环境要求
项目 | 说明 |
服务器 | TaiShan 200 服务器(型号2280) |
CPU | Kunpeng 920 |
OS | CentOS 7.6 |
调优工具 | Kunpeng DevKit Java性能分析工具 |
3 前提条件
- 服务器和操作系统正常运行;
- PC端已经安装SSH远程登录工具;
- 需要优化的Java程序。
4 调优思路
- 使用Java性能优化工具对Java进程进行在线分析;
- 使用Java性能优化工具对Java进程进行采样分析;
- 针对性能的瓶颈点进行性能优化;
- 观察优化后的Java程序,判断问题是否解决。
5 调优过程
5.1 System.gc() 引起的 GC
5.1.1 步骤一:对目标程序进行在线分析

5.1.2 步骤二:切换到 GC 页签


发现有些GC是因为调用 System.gc() 函数引起的,这时候会给出优化建议,关于System.gc() 函数的使用注意事项。
5.1.3 步骤三:根据优化建议,开启启动参数 -XX:+ExplicitGCInvokesConcurrent


发现 System.gc() 函数引起的GC 垃圾回收器由 Old 变成了Young ,缓解了垃圾回收的压力。
5.1.4 总结
程序中 System.gc() 函数的使用要慎重,如果明确程序中不会用到,并且依赖的相关框架也不使用,可以启用参数:-XX:+DisableExplicitGC 进行禁用。如果程序或依赖框架需要使用该函数,则需要开启参数:-XX:+ExplicitGCInvokesConcurrent 优化 GC 方式。
5.2 扩容元空间引起的GC
5.2.1 步骤一:对目标程序进行在线分析,切换到GC页签

发现有些GC原因是:Metadata GC Threshold, 元空间扩容引起GC。
5.2.2 步骤二:对程序进行采样分析,切换到 GC 页签

根据采样分析会看到元空间的内存使用情况,以及一份优化建议,是因为 MetaspaceSize 设置的过低或者不符合程序的实际情况造成的。
5.2.3 步骤三:根据优化建议调高 MetaspaceSize 的值


MetaspaceSize值调高后发现程序没有再出现因为扩容元空间引起的GC
5.2.4 总结
虽然元空间替换了永久代后开发人员可以不用再担心原先永久代内存不足的问题,但是元空间初始值设置不当,在某些情况下仍然会给jvm造成性能问题,尤其是一些涉及动态加载、卸载类功能的程序。为程序设置合理的元空间初始值是有必要的。
6 实践总结
本次实践中,介绍了如何使用Java调优工具发现并解决GC是由 使用System.gc()函数、扩容元空间引起的场景。在进行其他程序调优时,需要根据Kunpeng Devkit性能优化工具采集分析的实际结果和对应的优化建议进行调优操作。具体的调优思路可以参考本次实践。


