JVM(Java虚拟机)的三色标记法是一种用于垃圾回收(GC)的算法,用于标记和清除不再使用的对象。它基于对象的可达性分析,将对象分成三个不同的颜色:黑色、灰色和白色。
-
黑色:表示对象已经被标记为可达性分析的一部分,即该对象是可达的,其引用链上的所有对象都已经被垃圾回收器扫描过。
-
灰色:表示对象还未被完全扫描和分析。当一个对象被标记为灰色时,它的引用链上的对象尚未被扫描和分析,即引用链上的其他对象还未确定是否可达。
-
白色:表示对象尚未被扫描和分析,即还未确定是否可达性。在标记阶段之前,所有的对象都是白色。
垃圾回收器首先将所有的对象标记为白色,然后从根对象(如活动线程、全局变量等)开始,通过深度优先搜索算法遍历对象引用链,并将可达的对象标记为黑色。一旦完成可达性分析,所有剩余的白色对象都可以判定为不可达,即垃圾对象,最终将被清除。
JVM的三色标记法是一种高效的垃圾回收算法,能够准确地标记和清除不再使用的对象,从而释放内存资源。它是现代JVM垃圾回收器中的一种常用算法。
例子:
假设有以下对象:A、B、C、D。我们从根对象开始标记和清除。
初始状态:所有对象都被标记为白色。
根对象标记:从根对象开始,比如活动线程、全局变量等,将它们标记为灰色。
遍历引用链:从灰色对象开始,按深度优先搜索算法遍历其引用链,将可达的对象标记为灰色。
黑色标记:一旦对象的引用链上的所有对象都被扫描过,将该对象标记为黑色,表示已经完成标记。
清除白色对象:所有剩余的白色对象都可以判定为不可达,即垃圾对象,将它们从内存中清除。
这个过程就是JVM三色标记法的基本流程。通过这种方式,只有被标记为黑色的对象会被保留下来,其余的白色对象会被清除,从而实现垃圾回收的功能。