JVMG1
JVM Garbage First
Last updated
JVM Garbage First
Last updated
Java有三个基础GC 算法
Mark-Sweep标记清除
它分为两个阶段:标记和清除。
标记阶段会遍历所有可达的对象,并将它们标记为存活。清除阶段会删除所有未被标记的对象,即垃圾对象。
这种算法的优点是实现简单,不需要额外的空间。缺点是会产生内存碎片,导致后续分配大对象时可能失败。
Copying拷贝
一种将内存分为两个相等的区域,每次只使用其中一个区域的算法。当这个区域快要用完时,就会将存活的对象复制到另一个区域,并清空原来的区域。
这种算法的优点是不会产生内存碎片,且复制过程中不需要暂停应用程序。缺点是浪费了一半的内存空间,且复制大量对象时会影响性能
Mark-Compact标记压缩
一种结合了标记清除和拷贝算法的思想的算法。它也分为两个阶段:标记和压缩。
标记阶段和标记清除算法相同,都是遍历所有可达的对象,并将它们标记为存活。压缩阶段则是将所有存活的对象向内存空间的一端移动,并更新它们的引用地址。
这种算法的优点是既不会浪费内存空间,又不会产生内存碎片。缺点是移动对象和更新引用地址时需要暂停应用程序。
Java有两种GC模型
分代模型
分区模型
在这两种模型之上,Java建立了10中GC,如下图
ParNew
Copying
CMS
Mark-Sweep
G1
Copying和Mark-Compact
Serial
Copying或Mark-Compact
SO
Mark-Compact
ZGC
Copying和Mark-Compact
PS
Copying
PO
Mark-Compact
Shenandoah
Copying和Mark-Compact
分代模型年轻代GC
A stop-of-world(STW), copying collector which uses a single GC thread.
垃圾到一定程度后,所有业务线程停止,GC开始工作。会导致Java程序运行到一定时候出现卡顿。
GC的标记阶段一般采用三色标记法,但是存在诸多bug,同时也会提到CMS对其解决方案。