JVM基础06-垃圾回收器

1. 什么是垃圾?
        要确认一个对象是否为垃圾,可以从以下两个算法进行判断。
1.1 引用计数法
        只要应用程序中持有该对象的引用,也就是该对象的引用计数不为0,就说明它不是垃圾。反之如果没有任何引用指针对其引用就说明是 垃圾。     
        注:这种算法有一个很明显的弊端,那就是两个对象中相互引用时,则不会被回收
1.2 可达性分析法
        1.2.1 通过GC Root的对象,开始向下寻找,看某个对象是否可达。
        1.2.2 能作为GC Root: 类加载器、Thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等。
        1.2.3 具体的有:
        虚拟机栈(栈帧中的本地变量表)中引用的对象。
        方法区中类静态属性引用的对象。
        方法区中常量引用的对象。
        本地方法栈中JNI(即一般说的Native方法)引用的对象。
2. 什么是垃圾回收器,怎么回收垃圾?
        2.1 垃圾回收器就是对JVM内存空间的无用对象的销毁并回收其占用的内存空间的一种机制。
        2.2 什么时候进行垃圾回收?
                GC是由JVM自动完成的,根据JVM系统环境而定,所以时机是不确定的。当然,我们可以手动进行垃圾回收,比如调           用System.gc()方法通知 JVM进行一次垃圾回收,但是具体什么时刻运行也无法控制。也就是说System.gc()只是通知要回             收,什么时候回收由JVM决定。
                根据垃圾回收机制反推回来看就是:Eden区或者S区不够用了、Old区不够用了、方法区不够用了或者System.gc()方            法 的调用会引起垃圾回收。
        2.3 垃圾怎么回收-回收算法
                2.3.1 标记-清除
                        扫描内存空间并标记出要回收的对象,再对标记的对象进行回收,比较耗时。同时这种算法会造成很多空间碎                      片、太多的空间碎片可能         
               导致后面需要分配较大对象时,找不到够大的连续内存而提前触发GC。
                2.3.2 标记-整理
                        标记过程仍然与"标记-清除"算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都                     向一端移动,然后直接清理掉端边界以外的内存。
                2.3.3 标记-复制
                        将内存划分为两块相等的区域,每次只使用其中一块,当其中一块内存使用完了,就将还存活的对象复制到另外                    一块上面,然后把已经使用过的内存空间一次清除掉,缺点就是空间利用率低。
        2.4 分代回收算法
                2.4.1 新生代:适用标记复制算法,因为新生代的对象大多是朝生夕死的,存活率低,复制效率高
                2.4.2 老年代:适用标记清除和标记整理算法,因为老年代的对象存活率高,使用复制算法效率反而更低,而且这种算                  法需要浪费一半的内存空间,非常不适合在老年代中使用。
3. 有哪些垃圾回收器?
        3.1 JVM中的垃圾回收器图览:

        注:JDK11后引入了Zero GC,感兴趣的可以了解一下。
        3.2 Serial
        一种单线程收集器,不仅仅意味着它只会使用一个CPU或者一条收集线程去完成垃圾收集工作,更重要的是其在进行垃圾收集的时候需要暂停其他线程。
        3.2.1 Serial优缺点:简单高效,拥有很高的单线程收集效率,但收集过程需要暂停应用线程。
        3.2.2 算法:复制算法
        3.2.3 应用:Client模式下的默认新生代垃圾收集器。
        3.3 Serial Old
        一种单线程收集器,执行过程和Serial一样。Serial Old是应用在老年代的收集器。采用“标记-整理算法”。
        3.4 ParNew 
        一种多线程收集器,和Serial相比不同的就是采用多线程收集罢了。
        3.4.1 算法:复制算法
        3.4.2 ParNew优缺点:在多CPU时效率比Serial高,单核时比Serial效率差。
        3.4.3 应用:Server模式下的默认新生代垃圾收集器
        3.5 Parallel Scavenge
        一种并行的多线程收集器,适用于新生代。Parallel Scavenge更关注系统的吞吐量。
        3.6 Parallel Old
        是 Parallel Scavenge老年代版本,采用标记整理算法,同样关注系统的吞吐量。
        3.7 CMS
        CMS是适用老年代的垃圾回收器,采用“标记-清除”算法。同时它采用“并发标记”和“并发整理”的工作机制使得在这两个个过程中可以和其他应用线程共同工作,降低了回收停顿时间。
        3.7.1 优缺点:并发收集,低停顿时间;产生空间碎片,并发阶段会降低吞吐量。
        3.7.2 CMS工作步骤图解

        3.8 G1收集器
        使用G1收集器时,Java堆的内存布局与就与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合。每个Region大小都是一样的,可以是1M到32M之间的数值,但是必须保证是2的n次幂如果对象太大,一个Region放不下[超过Region大小的50%],那么就会直接放到H中。设置Region大小:-XX:G1HeapRegionSize=M。所谓Garbage-Frist,其实就是优先回收垃圾最多的Region区域。
        3.8.1 G1特性
        (1)分代收集(仍然保留了分代的概念)
        (2)空间整合(整体上属于“标记-整理”算法,不会导致空间碎片)
        (3)可预测的停顿(比CMS更先进的地方在于能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒)。
        3.8.2 Region图解 

        3.8.3 G1收集器工作流程图示:

        初始标记:标记GCRoots能够关联的对象,并且修改TAMS的值
        并发标记:从GCRoot出发进行可达性分析,找到存活对象
        最终标记:修正并发标记阶段产生的数据差异
        筛选回收:对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间制定回收计划。
        3.9 Zero GC
        这是JDK11后引入的收集器,不管是物理上还是逻辑上,ZGC中已经不存在新老年代的概念了会分为一个个page,当进行GC操作时会对page进行压缩,因此没有碎片问题只能在64位的linux上使用,目前用得还比较少。
        3.9.1 ZGC特性
        (1)可以达到10ms以内的停顿时间要求
        (2)支持TB级别的内存
        (3)堆内存变大后停顿时间还是在10ms以内
4. 垃圾回收器分类
        4.1 串行收集器:Serial 及Serial Old,只有一个GC线程,用户线程暂停
        4.2 并行收集器:Parallel Scanvenge、Parallel Old。吞吐量优先,多条GC线程并发,但用户线程暂停
        4.3 并发收集器:CMS、G1,停顿时间优先,用户线程和GC线程同时执行,垃圾收集线程执行的时候不会停顿用户线程。
5. 垃圾回收器扩展
        5.1 什么是停顿时间、吞吐量?
                停顿时间:垃圾回收器进行垃圾回收终端应用执行响应的时间。
                吞吐量:运行用户代码时间/(运行用户代码时间+垃圾收集时间)这两个指标是评价垃圾收集器性能的标准。
        5.2 如何选择适合的垃圾收集器?
                优先调整堆的大小让服务器自己来选择
                如果内存小于100M,使用串行收集器
                如果是单核,并且没有停顿时间要求,使用串行或JVM自己选
                如果允许停顿时间超过1秒,选择并行或JVM自己选
                如果响应时间最重要,并且不能超过1秒,使用并发收集器
        5.3 什么时候选择G1收集器?
                JDK9的默认垃圾收集器,适用新老年代。
                (1)50%以上的堆被存活对象占用
                (2)对象分配和晋升的速度变化非常大
                (3)垃圾回收时间比较长
        5.4 如何开启指定的垃圾收集器
                使用-XX: +Use某某垃圾收集器这样子的配置信息。
6. 最后以一位大佬总结的垃圾回收器的图加深一下理解和记忆

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章