小白进阶篇之为什么你的JVMSurvivor区仅仅20M

背景

某一天,有一位同学在群里发来一张 jmap -heap 内存使用情况图。

说 Survivor 区占比总是在 98% 以上。

 

image

 

 

仔细观察这张图,其中包含几个重要信息:

  1. From 和 To 区都比较小,只有 10M。容量比较小,才显得占比高。
  2. Old 区的占比和使用量(两个多 G)都比较高。

此外,还可以看到 Eden、From、To 之间的比例不是默认的 8:1:1。

于是,立马就想到 AdaptiveSizePolicy。

经群友的确认,使用的是 JDK 1.8 的默认回收算法。

JVM 参数配置如下:

 

image

 

 

参数中没有对 GC 算法进行配置,即使用默认的 UseParallelGC。

用默认参数启动一个基于 JDK 1.8 的应用,然后使用 jinfo -flags pid 即可查看默认配置的 GC 算法。

 

image

 

 

默认开启 AdaptiveSizePolicy

AdaptiveSizePolicy(自适应大小策略) 是 JVM GC Ergonomics(自适应调节策略) 的一部分。

如果开启 AdaptiveSizePolicy,则每次 GC 后会重新计算 Eden、From 和 To 区的大小,计算依据是 GC 过程中统计的 GC 时间、吞吐量、内存占用量

JDK 1.8 默认使用 UseParallelGC 垃圾回收器,该垃圾回收器默认启动了 AdaptiveSizePolicy。

AdaptiveSizePolicy 有三个目标:

  1. Pause goal:应用达到预期的 GC 暂停时间。
  2. Throughput goal:应用达到预期的吞吐量,即应用正常运行时间 / (正常运行时间 + GC 耗时)。
  3. Minimum footprint:尽可能小的内存占用量。

AdaptiveSizePolicy 为了达到三个预期目标,涉及以下操作:

  1. 如果 GC 停顿时间超过了预期值,会减小内存大小。理论上,减小内存,可以减少垃圾标记等操作的耗时,以此达到预期停顿时间。
  2. 如果应用吞吐量小于预期,会增加内存大小。理论上,增大内存,可以降低 GC 的频率,以此达到预期吞吐量。
  3. 如果应用达到了前两个目标,则尝试减小内存,以减少内存消耗。

注: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 查看堆中的实例。

 

image

 

 

可以看出,其中有两个类的实例比较多,分别是:

  1. LinkedHashMap$Entry
  2. 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 用于保存

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值