GC是Garbage Collection的缩写,中文意为垃圾收集。它是Java虚拟机中自动管理内存的机制,用于回收由程序运行产生的无用对象和空间,防止内存泄漏。
Java程序的垃圾回收机制主要包括:
- 可达性分析:通过对象之间的引用关系来判断哪些对象是”可达的”,哪些是”不可达的”。可达对象是存活的,不可达对象是要回收的垃圾。
- 垃圾收集算法:主要有引用计数法、标记清除法和标记压缩法等。用于实现垃圾的识别和清理工作。
- 垃圾回收器:主要有Serial、ParNew、Parallel Scavenge和CMS等垃圾收集器。它会在内存使用达到一定阈值时自动启动,对堆内存进行垃圾回收。
Java程序中的GC工作过程如下:
- 垃圾收集器线程检查堆内存使用是否超过阈值,如果超过则启动垃圾回收。
- 使用可达性分析算法分析对象间的引用关系,判断出所有的”可达对象”。
- 对”不可达对象”使用选定的垃圾收集算法进行回收,回收其占用的内存空间。
- 对回收得到的内存空间进行内存碎片的合并工作,然后供程序继续使用。
我们可以通过System.gc()或JConsole等工具手动触发垃圾回收,但不确保立即回收,只是建议虚拟机的垃圾收集线程执行回收工作。
来看一个简单例子:
public class GCDemo {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
o1 = o2; // o1和o2可达,o2不可达
o1 = null; // o1和o2都不可达,成为垃圾
// 手动触发垃圾收集
System.gc();
}
}
在该例子中,o1和o2开始都是可达对象,随着o1=o2和o1=null的执行,o1和o2都变为不可达,会成为垃圾收集的目标对象。