JVM8自适应导致内存居高不下
? YOUNG GC ? ? jvm年轻代分为eden区和survivor区,对象被创建后首先在eden区,如果一次young gc没有将其回收的话,会到survivor区。从survivor区到old generation需要了解下动态年龄判断 ? ? 动态年龄判断: ? ? ? ? 1.对象超过15次没有被回收,可以通过MaxTenuringThreshold设置 ? ? ? ? 2.相同年龄的对象超过survivor区的50%,可以通过TargetSurvivorRatio设置 ? ?对象超过15次没有被回收不太可能,那就是survivor区太小了?我们通过命令?jmap -heap 进程号来查看堆信息 ? ? ?? ? ?启动程序时,只设置了初始堆内存和最大堆内存大小,其他都是默认参数。默认情况下,新生代和老年代的默认比例是1:2,eden区和两个survivor区的默认比例是8:1:1 ?而上图中我们可以看到年轻代与老年代的比例约等于 1:3 。eden区和两个survivor区的比例为199:1:1,都100多倍了 ? AdaptiveSizePolicy 经过查询发现JDK1.8的默认垃圾回收器是UseParallelGC ,默认启动了AdaptiveSizePolicy。这个参数会让垃圾回收器根据每次垃圾回收的GC时间和吞吐量来动态调整eden区和survivor区的比例。 ?AdaptiveSizePolicy有三个目标:
? AdaptiveSizePolicy为了达到三个预期目标,涉及以下操作:
AdaptiveSizePolicy 看上去很智能,但有时它也很调皮,会引发 GC 问题。 ?我们上图中,eden区和两个survivor区的比例都100多倍了,其原因就是AdaptiveSizePolicy为了达到期望的目标而进行了调整。 ? ? 处理方案 ? 方案一 :? ?关闭AdaptiveSizePolicy策略,同时显式申明survivor区的比例。JVM增加参数 -XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8
? ?方案二 : 使用CMS垃圾回收器。CMS默认关闭AdaptiveSizePolicy。JVM配置参数 -XX:+UseConcMarkSweepGC ?
? ? ? ? 参考地址 堆内存居高不下,JDK8自适应作怪 :https://www.jianshu.com/p/564017fe8a04 JVM GC 之 [AdaptiveSizePolicy] 实战 : https://www.jianshu.com/p/7414fd6862c5 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |