GC是什么

分代收集算法

次数上频繁收集Young区 Minor GC

次数上较少收集Old区 Full GC

基本不动Perm永久区

GC是发生在哪个部分

GC是发生在堆(heap)里面的

GC分几种?

:one:引用计数法(被淘汰)

缺点:

  • 每次对对象赋值时均要维护引用计数器,且计数器本身也有一定的消耗
  • 较难处理循环引用

JVM的实现一般不采用这种方式

:two:复制算法(Copying)

年轻代中使用的是Minor GC,这种GC算法采用的是复制算法(Copying)

原理:

  • 从根集合(GC Root)开始,通过Tracing从From中找到存活对象,拷贝到To中;
  • From丶To交换身份,下次内存分配从To开始

优势:heavy_check_mark:

  • 没有标记和清除的过程,效率高

  • 没有内存碎片,可以利用bump-the-pointrt实现快速内存分配

劣势:heavy_multiplication_x:

  • 需要双倍空间

:three:标记清除(Mark-Sweep)

老年代一般是由标记清除或者是标记清除与标记整理的混合实现

原理

  • 1.标记(Mark)

    从根集合开始扫描,对存活的对象进行标记

  • 2.清除(Sweep)

    扫描整个内存空间,回收未被标记的对象,使用free-list记录可以区域.

优势:heavy_check_mark:

  • 不需要额外空间

劣势:heavy_multiplication_x:

  • 两次扫描,耗时严重
  • 会产生内存碎片

:four:标记压缩(Mark-Compact)

原理:

  • 1.标记(Mark)

    与标记-清除一样

  • 2.压缩(Compact)

    再次扫描,并往一段滑动存活对象.

优势:heavy_check_mark:

  • 没有内存碎片,可以利用bump-the-pointrt

劣势:heavy_multiplication_x:

  • 需要移动对象的成本

:five:标记清除压缩(Mark-Sweep-Compact)

原理:

  • 1.Mark-Sweep和Mark-Compact的结合
  • 2.和Mark-Sweep一致,当进行多次GC后才Compact

:heavy_check_mark:减少移动对象的成本

评论