关于jvm垃圾收集器算法你了解多少?

105 阅读2分钟

全文内容

垃圾收集器算法有三种:

  1. 标记-清除算法: 标记堆上垃圾, 并清除垃圾
  2. 标记-复制算法: 标记堆上存活对象, 并复制到另一块内存中
  3. 标记-整理算法: 标记对上存活对象, 将其依次移动规整为一个整体, 防止出现内存碎片

三者的优点和缺点

标记-清除算法

它会扫描整个堆, 标记垃圾, 最后清理掉这些垃圾

优点

gc时间对比另外两种算法来说最快

缺点

内存没做整理, 到处都是碎片化的内存, 导致分配较大对象时碎片化的内存可能无法被使用, 需要再找个可以存储该对象的内存块

这会导致程序吞吐量变低, 因为 执行 gc 的频率较少, 但是 new 对象 分配内存的频率较高

image.png

使用场景

垃圾收集器较小的情况下可以使用该垃圾收集算法, 但是我觉得也不太行

内存碎片不整理, 迟早会出事

CMS 就是基于 标记清除算法, 但是它也添加了看内存碎片程度是否执行整理的功能

标记-复制算法

标记堆上存活对象, 并复制到另一块内存中

image.png

优点

标记复制算法,的优点在于复制之后的内存是完整的,不是碎片化的

缺点

缺点有这几点 第一点内存的占用比较大,第2点呢,如果线程的对象较多的话,那么复制到内存块二中的时间就会较长,导致整体GC的时间变长,而且还有第3个缺点,就是如果内存块一中的对象较大较多无法复制的内存块2,就需要一个担保机制,另外存放到老年代的内存中,这里有三点缺点

使用场景

标记复制算法合适,内存块1中幸存的对象较少,并且内存较为充裕的情况下才可以使用

标记整理算法

它会标记堆中幸存的对象将其依次移动整理

image.png

优点

不会产生内存碎片的问题

缺点

整理的过程需要消耗很大的时间和CPU的计算资源

为了防止对象移动过程中出现一些错误,就需要stop the world

使用场景

CMS. 基于标记清除算法,但是在适当的时候,他也会执行一次标记整理算法,但这需要看内存空间碎片化的程度,是否大到已经影响到对大对象的分配

部分图片来源于网络, 侵删