JVMG1
JVM Garbage First
Last updated
JVM Garbage First
Last updated
Java有三个基础GC 算法
Mark-Sweep标记清除 | 它分为两个阶段:标记和清除。 标记阶段会遍历所有可达的对象,并将它们标记为存活。清除阶段会删除所有未被标记的对象,即垃圾对象。 这种算法的优点是实现简单,不需要额外的空间。缺点是会产生内存碎片,导致后续分配大对象时可能失败。 |
Copying拷贝 | 一种将内存分为两个相等的区域,每次只使用其中一个区域的算法。当这个区域快要用完时,就会将存活的对象复制到另一个区域,并清空原来的区域。 这种算法的优点是不会产生内存碎片,且复制过程中不需要暂停应用程序。缺点是浪费了一半的内存空间,且复制大量对象时会影响性能 |
Mark-Compact标记压缩 | 一种结合了标记清除和拷贝算法的思想的算法。它也分为两个阶段:标记和压缩。 标记阶段和标记清除算法相同,都是遍历所有可达的对象,并将它们标记为存活。压缩阶段则是将所有存活的对象向内存空间的一端移动,并更新它们的引用地址。 这种算法的优点是既不会浪费内存空间,又不会产生内存碎片。缺点是移动对象和更新引用地址时需要暂停应用程序。 |
Java有两种GC模型
分代模型
分区模型
在这两种模型之上,Java建立了10中GC,如下图
分代Young | 分代Old | 分区模型 | |||
---|---|---|---|---|---|
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对其解决方案。