什么是GC?Java程序的垃圾回收机制是如何工作的?代码举例讲解

GC是Garbage Collection的缩写,中文意为垃圾收集。它是Java虚拟机中自动管理内存的机制,用于回收由程序运行产生的无用对象和空间,防止内存泄漏。

Java程序的垃圾回收机制主要包括:

  1. 可达性分析:通过对象之间的引用关系来判断哪些对象是”可达的”,哪些是”不可达的”。可达对象是存活的,不可达对象是要回收的垃圾。
  2. 垃圾收集算法:主要有引用计数法、标记清除法和标记压缩法等。用于实现垃圾的识别和清理工作。
  3. 垃圾回收器:主要有Serial、ParNew、Parallel Scavenge和CMS等垃圾收集器。它会在内存使用达到一定阈值时自动启动,对堆内存进行垃圾回收。

Java程序中的GC工作过程如下:

  1. 垃圾收集器线程检查堆内存使用是否超过阈值,如果超过则启动垃圾回收。
  2. 使用可达性分析算法分析对象间的引用关系,判断出所有的”可达对象”。
  3. 对”不可达对象”使用选定的垃圾收集算法进行回收,回收其占用的内存空间。
  4. 对回收得到的内存空间进行内存碎片的合并工作,然后供程序继续使用。

我们可以通过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都变为不可达,会成为垃圾收集的目标对象。