美文网首页
Java回收器G1使用

Java回收器G1使用

作者: TZX_0710 | 来源:发表于2021-05-26 16:05 被阅读0次

    JDK8 默认使用的是ParallelGC。JDK1.9默认使用G1

    1. G1收集器(-XX:+UseG1GC)

    G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机械,已极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特性。`

    2. G1回收过程

    • 初始标记(initial mark,STW)
    • 并发标记(concurrent marking)
    • 最终标记(remark ,STW)
    • 筛选回收(cleanup STW)
    • 并行与并发
    • 分代收集
    • 空间整合
    • 可预测的停顿

    3. G1参数设置

    -XX:+UseG1GC: 使用G1收集器(虚拟机内存8G以上,经验值)
    -XX:ParallelGCThreads: 指定GC工作的线程数量(默认值即可)
    -XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的N次幂),默认将整堆划分为2048个分区
    -XX:MaxGCPauseMillis:目标暂停时间(默认200ms)
    -XX:G1NewSizePercent:新生代内存初始空间(默认整堆5%)
    -XX:G1MaxNewSizePercent:新生代内存最大空间
    -XX:TargetSurvivorRatio:Survivor区的填充容量(默认50%),Survivor区域里的一批对象(年龄1+年龄2+年龄n的多个年龄对象)总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代
    -XX:MaxTenuringThreshold:最大年龄阈值(默认15)
    -XX:InitiatingHeapOccupancyPercent:老年代占用空间达到整堆内存阈值(默认45%),则执行新生代和老年代的混合收集(MixedGC),比如我们之前说的堆默认有2048个region,如果有接近1000个region都是老年代的region,则可能就要触发MixedGC了
    -XX:G1MixedGCLiveThresholdPercent(默认85%) region中的存活对象低于这个值时才会回收该region,如果超过这个值,存活对象过多,回收的的意义不大。
    -XX:G1MixedGCCountTarget:在一次回收过程中指定做几次筛选回收(默认8次),在最后一个筛选回收阶段可以回收一会,然后暂停回收,恢复系统运行,一会再开始回收,这样可以让系统不至于单次停顿时间过长。
    -XX:G1HeapWastePercent(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了

    4. 应用场景

    50%以上的堆被存活对象占用
    对象分配和晋升的速度变化非常大
    垃圾回收时间特别长,超过1S
    8GB以上的堆内存(建议值)
    停顿时间是500ms以内
    G1天生就适合这种大内存机器的JVM运行,可以比较完美的解决大内存垃圾回收时间过长的问题。

    jdk1.8绝大多数公司用parall + cms
    G1依然基于分代收集理论
    新生代最大默认为60%
    对于大内存的机械 minorGC也会卡 所以建议使用G1或者zgc kafka
    年轻带的收集不一定比老年代快
    g1的浮动垃圾很多 不在乎 下次再回收
    分代原因:很多对象的生命周期不一样,特点不一样,所以要进行分代

    5. 如何选择垃圾收集器

    • 优先调整堆的大小让服务器自己来选择
    • 如果内存小于100M,使用串行收集器
    • 如果是单核,并且没有停顿时间的要求,串行或者jvm自己选择
    • 如果允许停顿时间超过1秒,选择并行或者jvm自己选
    • 如果响应时间很重要,并且不能超过1秒,使用并发收集器
    • 4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC

    相关文章

      网友评论

          本文标题:Java回收器G1使用

          本文链接:https://www.haomeiwen.com/subject/covksltx.html