GC性能分析实战:http负载下如何选择堆大小

5 阅读3分钟

在系统上线前,一般都会进行压测,确定系统所需的各项资源,例如Java程序选择多大的堆内存可以保证服务在额定压力下可以高效正常运行,一般的手段是对比不同堆大小下面的压测结果、GC性能来确认,但都需要人工进行对比,当然借助一些工具可以提高效率,但还是没有非常方便的自动对比工具。

下面借助这个案例来展示,通过AI Agent和大模型,实现自动对比并给出合理的堆大小选择建议。

压测环境

  • WSL2+Ubuntu 24.04LTS
  • CPU 8c
  • MEM 12G

压测使用renaissance的fingle-http测试,分别测试2G/4G堆下面的情况,最终确认哪个堆大小更合适这个负载。

JVM参数

-XX:MaxMetaspaceSize=1073741824 
-XX:MetaspaceSize=536870912 
-XX:+PrintAdaptiveSizePolicy 
-XX:+PrintGC 
-XX:+PrintGCApplicationConcurrentTime 
-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintGCDateStamps 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-XX:+PrintHeapAtGC 
-XX:+PrintPromotionFailure 
-XX:+PrintTenuringDistribution 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:+UseParallelGC 

压测结果

jdkcollectorbenchmarkheapiterationsduration_min_msduration_avg_msduration_max_msuptime_avg_ms
8parallelfinagle-http2G1033083866715434225
8parallelfinagle-http4G1034244006737336081

GC报告

  • 堆设置2G的GC日志分析报告,结论是健康,但YoungGC频率较高 gc-2g.png

  • 堆设置4G日志分析报告,结论是健康 gc-4g.png

单看报告,http负载在2G/4G都可以正常工作,但选择2G还是4G呢,可能大部分情况下会选择4G,更多的内存意味着冗余空间更多,但相对地,内存资源分配需要加倍,如果是大量微服务组成的系统,意味着资源需求会增加不少。

AI分析

接下来,使用AI Agent和大模型的能力,对比分析一下两份报告,看看会给出什么结论。

第一轮分析,AI给出了2G堆更合适的结论,并且给出两个堆下面的关键指标对比,部分指标是4G堆略优,部分指标是2G略优。不过AI这里误将测试结果中的时间理解为延迟,所以在下一轮提示AI进行修正。

用户输入:

这是http测试的情况,请结合GC日志分析堆内存设置哪个更合适:  
jdk collector benchmark heap iterations duration_min_ms duration_avg_ms duration_max_ms uptime_avg_ms  
8 parallel finagle-http 2G 10 3308 3866 7154 34225  
8 parallel finagle-http 4G 10 3424 4006 7373 36081

模型输出: jvmind-1a967d-fb11fb.png

第二轮分析

用户输入:

修正一下,提供的测试结果是renaissance的http测试结果,里面的耗时是测试时长,不是延迟

模型输出:

jvmind-149673-c3c3c7.png

模型最终的结论是:2G堆更合适当前的负载,4G堆属于过度分配。