JVM(二)垃圾回收器和内存分配策略

2020-05-29  本文已影响0人  7ColorLotus
垃圾回收器工作示意图.png

3> Parallel Scavenge(ParallelGC)/Parallel Old 关注吞吐量

        a, 停顿时间短的适合用户交互的程序(桌面应用),提高用户体验。
        b, 关注吞吐量,适用于后台计算任务. 
        c, -XX:MaxGCPauseMills 控制最大停顿时间 
        d, -XX:GCTimeRatio 允许的GC时间占总时间的比率,吞吐量的导数,整数 允许的GC时间 比如19 1/1+19 = 5%
        e, -XX:+UseAdaptiveSizePolicy 自适应的调整策略
        d, -XX:+UsePrallerOldGC: 新生代ParallelGC,老年代 Parallel Old

4> CMS(Concurrent Mark Sweep) 关注最短停顿时间,标记清除

        a, CMS运行的过程
            (1) 初始标记:时间短暂,GC-Roots能直接关联的标记
            (2) 并发标记:和用户的应用程序同时进行
            (3) 重新标记:时间短暂
            (4) 并发清除:和用户的应用程序同时进行
        b, -XX:UseConcMarkSweepGC 表示老年代的用CMS,新生代使用ParNew
        c, 浮动垃圾:用户的线程还在运行,需要给用户线程留下运行内存空间。
        d, -XX:CMSInitialOccupyFraction当老年代的空间超过这个值时启动收集,默认68%(jdk6) -> 92%(jdk7以后)。
        e, 不够时,产生错误:Concurrent Mode Failure,启动Serial Old收集器
        f, -XX:UseCMSCompactAtFullCollection 需要Full GC的时候开启内存碎片的整理,无法并发,默认开启
        g, -XX:CMSFullGCsBeforeCompaction 设置多少次不压缩的FullGC后来一次要压缩的,默认为0
垃圾回收器工作示意图.png

5> G1(Garbage First)

        a, jdk7才正式引入,到jdk9默认是收集器。采用分区回收的思维,基本不牺牲吞吐量的前提下完成低停顿的内存回收;可以预测的提顿是其最大的优势
        b, 面向服务端应用的垃圾回收器,目标取代CMS
        c, 整体回收算法是标记整理,局部回收算法是复制算法
        d, 设置参数 -XX:+UseG1GC
        e, 并行和并发,分代收集,空间整合,没有空间碎片,可预测的停顿
        f, G1收集运行
            (1) 初始标记:时间短暂,GC-Roots能直接关联的标记,产生一个全局停顿,都会有一个新生代的GC
            (2) 根区域扫描:扫描Survivor区可以直接到达老年代的区域
            (3) 并发标记阶段
            (4) 重新标记
            (5) 独占清理
            (6) 并发清理
        g, G1收集的几个阶段
            (1)新生代GC
            (2)并发标记周期
            (3)混合收集
            (4)可能的FullGC
        h, -XX:MaxGCPauseMillis 指定目标的最大停顿时间,G1尝试调整新生代和老年代的比例,堆大小,晋升年龄
        i, -XX:ParallerGCThreads GC的工作线程数量
G1垃圾回收器工作示意图.png
G1收集的阶段.png

11. 吞吐量 = 运行用户代码时间/(运行用户代码时间 + 垃圾收集时间)
12. 垃圾收集时间 = 垃圾回收频率 * 单次垃圾回收时间
13. 未来的垃圾回收器,JDK11中的ZGC,一种可扩展的低延迟垃圾收集器

    1> 处理TB量级的堆
    2> GC时间不超过10ms
    3> 与使用G1相比,应用吞吐量的降低不超过15%
    4> 实现技术:有色指针和加载屏障
14. Stop The World现象:无法避免,调优尽量减少
上一篇 下一篇

猜你喜欢

热点阅读