SurvivorRatio=8,不起作用,实际Eden:S0:S1不是8:1:1

在使用jmap检查堆内存分配时,发现Eden与Survivor区比例未按8:1:1配置。实际比例为1:2,与NewRatio设置的2相符,但Survivor区大小异常。文档表明这可能与垃圾收集器(ParallelGC)及自适应大小调整策略有关。为恢复默认比例,需禁用自适应策略并设定SurvivorRatio为8。通过添加-XX:-UseAdaptiveSizePolicy和-XX:SurvivorRatio=8到JVM参数,可以实现期望的内存区域比例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

在使用jmap,查看堆内存分配情况时,发现一个奇怪的现象,Eden跟Survivor的比例并不是按照8:1:1的比例分配。

使用 jmap -heap pid

在这里插入图片描述
可以看到NewRatio=2 实际Eden:Old=74M:148M=1:2 符合预期。
SurvivorRatio=8 按照预期Eden:S0:S1=8:1:1

EdenS0S1
预期62,075,699B7,759,462B7,759,462B
实际58,720,256B9,437,184B9,437,184B

在这里插入图片描述
Eden 比预期偏小S0、S1比预期大。

查看官方文档

在这里插入图片描述
大意如下:
设置吞吐量垃圾收集器使用的初始生存空间比率(-XX:+UseParallelGC和或-XX:+UseParallelOldGC选项启用)。默认情况下,通过使用-XX:+UseParallelGC和-XX:+UseParallelOldGC选项,通过吞吐量垃圾收集器启用自适应调整大小,并根据应用程序行为从初始值开始调整生存空间的大小。如果禁用了自适应大小调整(使用-XX:UseAdaptiveSizePolicy选项),则应使用-XX:SivitorRatio选项为应用程序的整个执行设置幸存者空间的大小。

可以看到影响S0、S1的大小跟jvm使用的垃圾收收集器有关,查看进程jvm参数,可以看到确实使用了-XX:+UseParallelGC,要恢复默认的比例,需要关闭UseAdaptiveSizePolicy选项,同时显式加参数-XX:SivitorRatio=8。

VM Flags:
Non-default VM flags: 
-XX:CICompilerCount=12 
-XX:InitialHeapSize=232783872 
-XX:MaxHeapSize=3720347648 
-XX:MaxNewSize=1239941120 
-XX:MinHeapDeltaBytes=524288 
-XX:NewSize=77594624 
-XX:OldSize=155189248 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:+UseFastUnorderedTimeStamps 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseParallelGC

按照官方提示,启动参数加上

-XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8

在这里插入图片描述
可见,此时Eden:S0:S1=8:1:1

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值