鲲鹏社区首页
中文
注册
开发者
基于DevKit Java性能分析工具的调优实践——GC日志分析

基于DevKit Java性能分析工具的调优实践——GC日志分析

DevKitjavajdk性能调优

发表于 2025/12/29

0

1 调优概述

鲲鹏DevKit是一款提供涵盖迁移、测试、性能调优及系统诊断等各环节的开发使能工具集。其中,DevKit Java性能分析工具是针对基于鲲鹏的服务器上运行的Java程序的性能分析和优化工具,能图形化显示Java程序的堆、线程、锁、垃圾回收等信息,收集热点函数、定位程序瓶颈点,帮助用户采取针对性优化。本文使用Java性能优化工具对运行中的Java程序进行在线分析和采样分析,找到程序中的死锁问题,并根据分析结果进行优化修改,从而实现Java程序最佳运行。

2 环境要求

项目

说明

服务器

TaiShan 200 服务器(型号2280

CPU

Kunpeng 920

OS

CentOS 7.6

调优工具

Kunpeng DevKit Java性能分析工具

3 前提条件

  1. 服务器和操作系统正常运行。
  2. PC端已经安装SSH远程登录工具。
  3. 需要优化的Java程序且程序开启GC日志打印。

4 调优思路

  1. 使用Java性能优化工具对Java进程GC日志进行在线采集或离线上传,解析获取的GC日志。
  2. 针对解析后得到的优化建议项进行调优。
  3. 观察优化后的Java程序日志,判断对应问题是否改善。

5 调优过程

5.1 获取GC日志

5.1.1 对程序进行在线分析,在GC页签下GC日志页面

点击执行GC日志采集,获取日志并进行解析。

5.2 查看优化建议项

当前GC日志共有五项优化建议:

依次查看对应优化建议,并根据建议项进行信息修改。

5.2.1 元空间扩容导致的GC优化

jdk8以后移除永久区,使用本地内存来存储类元数据信息并称之为元空间(Metaspace)。持续的元空间垃圾回收说明:可能存在类、类加载器导致的内存泄漏或是大小设置不合适。

根据优化建议对代码进行排查,发现代码中存在每次调用循环动态创建并加载类。针对本例:可减循环次数,减少类的加载;将classes对象设为单例模式避免重复调用。

对于无法进行代码优化的案例结合成因分析,查看因元数据产生的GC次数及时间占比是否偏高,若想降低可调高-XX:MetaspaceSize,少因扩容造成的GC

5.2.2 疏散失败

当给出疏散失败时,表示存在GC幸存区或Old区空间不足,可增大响应空间避免出现疏散失败。当空间无法增加时可尝试调整如下选项:

  1. 调大-XX:G1ReservePercent(默认值10),设置堆老年代预留内存晋升,以降低提升失败的可能性;
  2. 降低-XX:InitiatingHeapOccupancyPercent阈值(默认45);
  3. 增加并行标记线程的数目,调大-XX:ParallelGCThreads参数(默认值随运行平台不同而不同)。

可在优化后重新执行GC日志采集,查看疏散失败优化建议是否触发。或在日志中统计单位时间内疏散失败的比例。

5.2.3 发生巨型对象导致的GC

当发生巨型对象分配时(大于region size50%),G1会找出一个连续的可用分区集合,这样就能汇总出足够的内存来容纳巨型对象。如果没有足够的连续可用空间,G1就会启动一次Full GC 来压缩Java堆空间。巨对象分配后对应region不再存储其它对象造成了一定的空间浪费。通过调大-XX:G1HeapRegionSize可减少因巨对象空间不足导致的Full GC且能提升内存利用率。

可通过GC成因分析查看G1 Humongous Allocation触发的GC占比统计看巨对象触发的GC是否由改善。

5.2.4 发生Full GC

当空间即将耗尽或分配速度无法追上回收速度时就会触发Full GC,当有Full GC发生代表性能可能不足。除关注程序本身是否可优化或提升机器性能(增加内存,提升cpu性能)外,还可以尝试调整相关参数提高GC效率来降低Full GC发生的可能性:

  1. 增加堆内存(Xmx)大小,让G1有更多的时间去完成 Concurrent Marking
  2. 适当加大 -XX:ConcGCThreads 选项的值,增加并发标记的线程数。
  3. 通过增加 -XX:G1ReservePercent(默认10%)的选项值,增加 G1 IHOP 分析过程中所需要的内存空间。
  4. 通过设置 -XX:-G1UseAdaptiveIHOP 的选项值禁用自适应 IHOP 分析机制,通过调小 -XX:InitiatingHeapOccupancyPercent 的选项(默认值为 45)值达到提前触发GC标记周期的目的。

可对比优化前与优化后的GC活动细化分析数据下的Full GC统计数据,通过对Full GC平均间隔时间对比可确定Full GC频率是否降低。

5.2.5发生System.GC()导致的GC

程序中不建议显示调用System.GC()强制触发Full GC。建议排查代码将相关代码移除。或使用-XX:+DisableExplicitGC忽略System.GC()调用。若为系统级别或框架级别的调用无法禁用,可开启-XX:+ExplicitGCInvokesConcurrentFull GC 会变成 initial-mark

检验优化效果可对优化后程序进行日志采集查看优化建议中是否还有system.GC()的优化建议。或查看GC日志看system.GC()触发日志是否存在,若存在看是否为initial-mark阶段

6 实践总结

Java中通过查看GC日志较难直接定位问题,故平台提供的GC日志解析后优化建议,通过优化建议可较为便捷的对代码进行排查或修改启动参数。重启进程并在运作一段时间后再次采集解析GC日志,通过对比前后日志吞吐量、GC平均暂停时间、活动细化分析-平均间隔时间等数据的变化,从而确定GC效率是否已经改善。

针对GC日志的调优不建议作为优先使用方案,可作为在程序自身调优已达瓶且无更多调优手段时的尝试。据GC优化建议对程序进行优化后无明显改善的,建议:升级机器配置以适应业务需求。


本页内容