JVM:不同垃圾收集算法和垃圾收集器 优缺点总结

 

如何判断对象是否为垃圾:
引用计数法:对象是否被引用,无法解决对象循环引用导致的问题
可达性分析:也叫根搜索法

 

垃圾收集算法

1、标记-清除(Mark-Sweep)

示意图

  • 深蓝色:有对象引用
  • 深灰色:没对象引用
  • 白色:待分配空间

首先,标记出所有需要回收的对象;然后,清除掉所有被标记的对象

回收前:对整个引用空间不连续的堆对象遍历
回收后:引用的对象空间不变,清除:对全部垃圾对象遍历后清除

 缺点:
耗时---整个堆的对象遍历
空间不连续,产生大量碎片空间---可能导致gc次数增多

 

2、复制算法(Copying):应用场景年轻代中s0,s1

示意图

将内存划分为两个等大小的区域,每次只使用其中一个区域。当该区域满时,将存活的对象复制到另一个区域,然后清空当前区域

回收前:空间复制,只用一份空间,对象引用空间不连续,生命周期短,朝生夕死,
回收后:会排列规整

优点:空间连续
缺点:浪费空间

 

3、标记-整理(Mark-Compact):应用场景---老年代

示意图

与标记-清除算法相同,但在清除阶段,存活的对象会向一端移动,然后清理掉端边界以外的内存。这种算法可以避免内存碎片问题,提高内存空间的利用率

回收前:对整个引用空间不连续的堆对象遍历
回收后:引用的对象空间连续,清除:没遍历全部,清除存活对象以外的空间

优点:空间连续,节约空间
缺点:标记耗时

 

4、分代收集算法:分代收集算法就是目前虚拟机使用的回收算法

这是一种综合应用,根据对象存活周期的不同,将内存划分为几个部分,如新生代和老年代。

  • 新生代采用复制算法,因为大多数对象很快就会死亡;
  • 老年代则采用标记-整理算法,因为老年代中的对象存活时间较长。

这种算法结合了复制算法和标记-整理算法的优点,既提高了效率又减少了内存碎片,是目前JVM中广泛采用的一种垃圾收集策略。

 

垃圾收集器 

1、串行收集器

特点:单线程、会暂停用户线程

  • Serial收集器,年轻代
  • SerialOld收集器,老年代

 

2、并行收集器:

特点:多线程、会暂停用户线程

普通:

  • ParNew收集器--年轻代
  • ParNew收集器对应老年代一般为CMS收集器

吞吐量优先:

  • Parallel Scavenge收集器,应用年轻代
  • Parallel Old收集器,应用老年代

 

3、并发收集器

特点:停顿时间优先,可以交替运行

  • CMS收集器,应用老年代,标记清除算法(不用标记整理是因为,整理后对象地址发生变化,用户线程对象运行中,会改变地址,如果有引用则会出错)  

    优点:并发收集、停顿时间短

    缺点:产生空间碎片、对cpu要求稍高、无法处理并发阶段产生的垃圾

  • G1收集器(jdk1.9默认),新老生代都适用,标记整理算法

 

在完善中......

 

posted on 2024-06-20 17:35  拾句  阅读(4)  评论(0编辑  收藏  举报