1、标记(Marking):
在标记阶段,垃圾回收器会从根对象开始,通过可达性分析算法遍历对象图,标记所有可以被访问到的对象。根对象通常是指应用程序中的静态变量、线程栈中的变量以及常量池中的对象等。垃圾回收器会递归地访问对象,并标记其为“存活”对象。如果一个对象无法通过任何途径与根对象连接,那么该对象就会被标记为“非存活”对象。
2、清除(Sweeping):
在清除阶段,垃圾回收器会扫描整个堆,回收所有未被标记为“存活”的对象所占用的内存空间。这些未被标记的对象将被认定为垃圾,其所占用的内存将被释放。这样,堆中就会腾出一些空闲的内存空间,以便后续的对象分配使用。
3、整理(Compacting,可选):
在某些垃圾回收算法中,还会包括内存整理的过程。在整理阶段,垃圾回收器会对存活的对象进行整理,将它们向堆的一端移动,从而释放出更多的连续内存空间。这有助于减少内存碎片化,并提高堆内存的利用率和分配效率。