在Java中,垃圾回收(Garbage Collection, GC)是自动管理内存的机制。根对象(GC Roots)是垃圾回收算法用来确定哪些对象是活跃的、不能被回收的对象。通常,根对象是指GC能够直接访问的对象引用,它们是垃圾回收的起点。
GC Roots的常见类型包括:
栈上的引用:
方法的局部变量和方法参数。
静态字段:
被 static 修饰的字段,通常包括类的静态变量。
活动线程:
当前运行的线程的引用。
常量池:
类常量池中的引用,比如字符串常量池。
JNI 引用:
Java Native Interface (JNI) 中的引用。
垃圾回收的基本流程:
标记阶段:从GC Roots开始,标记所有直接或间接可达的对象。
清除阶段:遍历堆内存,清除未被标记的对象。
整理阶段(如果有):将存活的对象整理到内存的一端,以提高空间利用效率。
GC Roots在不同垃圾回收器中的应用:
标记-清除算法:直接标记从GC Roots可达的对象,并清除未标记的对象。
标记-整理算法:类似于标记-清除,但在清除后将存活对象整理到堆的一端,便于空间利用。
复制算法:将存活对象复制到另一块内存区域,清除原有区域。
分代收集:根据对象的存活时间将对象分为年轻代和老年代,GC Roots用于标记和清除。
调试和监控:
可以使用工具如 jstat, jmap, VisualVM, Eclipse MAT 等来分析GC的行为和内存使用情况。