本文主要是介绍小白进阶篇之为什么你的JVMSurvivor区仅仅20M,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景
某一天,有一位同学在群里发来一张 jmap -heap 内存使用情况图。
说 Survivor 区占比总是在 98% 以上。
仔细观察这张图,其中包含几个重要信息:
- From 和 To 区都比较小,只有 10M。容量比较小,才显得占比高。
- Old 区的占比和使用量(两个多 G)都比较高。
此外,还可以看到 Eden、From、To 之间的比例不是默认的 8:1:1。
于是,立马就想到 AdaptiveSizePolicy。
经群友的确认,使用的是 JDK 1.8 的默认回收算法。
JVM 参数配置如下:
参数中没有对 GC 算法进行配置,即使用默认的 UseParallelGC。
用默认参数启动一个基于 JDK 1.8 的应用,然后使用 jinfo -flags pid 即可查看默认配置的 GC 算法。
默认开启 AdaptiveSizePolicy
AdaptiveSizePolicy(自适应大小策略) 是 JVM GC Ergonomics(自适应调节策略) 的一部分。
如果开启 AdaptiveSizePolicy,则每次 GC 后会重新计算 Eden、From 和 To 区的大小,计算依据是 GC 过程中统计的 GC 时间、吞吐量、内存占用量。
JDK 1.8 默认使用 UseParallelGC 垃圾回收器,该垃圾回收器默认启动了 AdaptiveSizePolicy。
AdaptiveSizePolicy 有三个目标:
- Pause goal:应用达到预期的 GC 暂停时间。
- Throughput goal:应用达到预期的吞吐量,即应用正常运行时间 / (正常运行时间 + GC 耗时)。
- Minimum footprint:尽可能小的内存占用量。
AdaptiveSizePolicy 为了达到三个预期目标,涉及以下操作:
- 如果 GC 停顿时间超过了预期值,会减小内存大小。理论上,减小内存,可以减少垃圾标记等操作的耗时,以此达到预期停顿时间。
- 如果应用吞吐量小于预期,会增加内存大小。理论上,增大内存,可以降低 GC 的频率,以此达到预期吞吐量。
- 如果应用达到了前两个目标,则尝试减小内存,以减少内存消耗。
注:AdaptiveSizePolicy 涉及的内容比较广,本文主要关注 AdaptiveSizePolicy 对年轻代大小的影响,以及随之产生的问题。
AdaptiveSizePolicy 看上去很智能,但有时它也很调皮,会引发 GC 问题。
即使 SurvivorRatio 的默认值是 8,但年轻代三个区域之间的比例仍会变动。
这个问题,可以参考来自R大的回答:
hllvm.group.iteye.com/group/topic…
HotSpot VM里,ParallelScavenge系的GC(UseParallelGC / UseParallelOldGC)默认行为是SurvivorRatio如果不显式设置就没啥用。显式设置到跟默认值一样的值则会有效果。
因为ParallelScavenge系的GC最初设计就是默认打开AdaptiveSizePolicy的,它会自动、自适应的调整各种参数。
在群友的截图中,From 区只有 10M,Eden 区占用了却超过年轻代八成的空间。
其原因是 AdaptiveSizePolicy 为了达到期望的目标而进行了调整。
大概定位了 Survivor 区小的原因,还有一个问题:
为什么老年代的占比和使用量都比较高?
于是群友使用 jmap -histo 查看堆中的实例。
可以看出,其中有两个类的实例比较多,分别是:
- LinkedHashMap$Entry
- ExpiringCache$Entry
于是,搜索关键类 ExpiringCache。
可以看出在 ExpiringCache 的构造函数中,初始化了一个 LinkedHashMap。
怀疑 LinkedHashMapEntry 直接有关。
ExpiringCache(long millisUntilExpiration) { this.millisUntilExpiration = millisUntilExpiration; map = new LinkedHashMap<String,Entry>() { protected boolean removeEldestEntry(Map.Entry<String,Entry> eldest) { return size() > MAX_ENTRIES; } }; }
注:该 map 用于保存
这篇关于小白进阶篇之为什么你的JVMSurvivor区仅仅20M的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!