zoukankan      html  css  js  c++  java
  • 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有三个目标:

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

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

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

    AdaptiveSizePolicy 看上去很智能,但有时它也很调皮,会引发 GC 问题。

     我们上图中,eden区和两个survivor区的比例都100多倍了,其原因就是AdaptiveSizePolicy为了达到期望的目标而进行了调整。

    上图中 Survior 区变小,老年代占比变高的原因分析如下

      1.在默认 SurvivorRatio = 8 的情况下,没有达到吞吐量的期望,AdaptiveSizePolicy 加大了 Eden 区的大小。From 和To 区被压缩到只有 2M。

      2.当 YGC 发生时候,由于 To 区太小,存活的对象直接进入到老年代。老年代占用量逐渐变大。

    处理方案

    方案一 :   关闭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

  • 相关阅读:
    一些正则表达式
    iOS汉字中提取首字母
    flutter 按钮弹簧动画AnimationController
    In iOS 14+,debug mode Flutter apps can only be launched from Flutter tooling,IDEs with Flutter plugins or from Xcode.
    Failed to connect to raw.githubusercontent.com port 443: Connection refused
    iOS组件库创建(二)
    iOS组件库创建(一)
    同个电脑多个ssh key的配置
    网络相关总结
    flutter 热更新实现方案—UI资源化(二)
  • 原文地址:https://www.cnblogs.com/kiko2014551511/p/11512678.html
Copyright © 2011-2022 走看看