JVM (三)- GC 垃圾回收器总结

 

        GC 垃圾回收器

 

垃圾回收算法:

  标记清除法

    从根节点开始标记所有可达对象,其余没标记的即为垃圾对象,执行清除。但回收后的空间是不连续的

 

  标记整理(压缩):

    适合用于老年代的算法(存活对象多于垃圾对象)。标记后不复制,而是将存活对象压缩到内存的一端,然后清理边界外的所有对象。

 

  复制算法:

    将内存分成两块,每次只使用其中一块,垃圾回收时,将标记的对象拷贝到另外一块中,然后完全清除原来使用的那块内存。复制后的空间是连续的。(适用于新生代)

 

垃圾回收器:

CMS 

        Concurrent Mark-Sweep 

        老年代回收器

        CMS:一种以获得最短停顿时间为目标的收集器,非常适用 B/S 系统。

        是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”来指定使用 CMS 垃圾回收器

 

        标记 - 清除垃圾算法实现 : 

                标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。

 

Serial Old

         CMS 的备选,Serial 垃圾回收器的老年版本,单线程

         老年代回收器

         标记 - 整理算法 进行垃圾回收:

                 标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。

 

Parallel Old 

          Serial Old 的多线程版本, Prallel 的老生代版本;

          老年代回收器

           标记-整理的内存回收算法 :

                    标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。

 

Serial 

        最早的单线程串行垃圾回收器

        新生代回收器

        复制算法 : 按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,

只有原来的一半。

               

ParNew

      ParNew 是 Serail 的多线程版本   

      新生代回收器

      复制算法 :

 

Parallel 

       和 ParNew 收集器类似是多线程的,但 Parallel 是吞吐量优先的收集器,可以牺牲等待时间换取系统的吞吐量。

 

G1

     整堆回收器:

      一种兼顾吞吐量和停顿时间的 GC 实现,是 JDK 9 以后的默认 GC 选项。

 

分代垃圾回收器

     分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。

     新生代使用的是复制算法,新生代里有 3 个分区:Eden、To Survivor、From Survivor,它们的默认占比是 8:1:1,它的执行流程如下

     把 Eden + From Survivor 存活的对象放入 To Survivor 区;

     清空 Eden 和 From Survivor 分区;
          From Survivor 和 To Survivor 分区交换,From Survivor 变 To Survivor,To Survivor
          变 From Survivor。

     

 

posted @ 2020-06-28 10:34  抽象Java  阅读(196)  评论(0编辑  收藏  举报