简单来讲,垃圾收集是释放不再被程序使用的内存的过程——清除垃圾,如果你希望的话。垃圾收集器(garbage collector)是Java中承担此职责的实体。当一个对象不再被程序使用时,它将此对象视为垃圾。
垃圾收集器怎样做出这种判断呢?正式来讲,不使用的对象指的是所有从任意活动线程,直接或间接,都不可达的对象。满足此条件的对象都将被收集,它们的内存将被回收并释放。
垃圾收集在何时或如何发生都依赖于垃圾收集器的实现。有许多可接受的收集策略,Java Language Specification将策略的选择权留给了各个JVM的实现。唯一要保证的是,在回收一个对象的内存之前,必须调用此对象的finalize方法,这个方法继承自Object,如果此对象没有定义它自己的finalize方法的话。这给了对象一个机会来做一些必要的清除动作。
请查阅Java Language Specification, section 12.6以获得Java垃圾收集的正式、详尽的描述。
引用对象是一种特殊类型的对象,用于保持对其他对象的引用,同时垃圾收集器仍然可以回收被引用对象的内存——这也被称作弱引用(weak reference)。引用对象允许程序保持对一些在必要时可被回收的对象的引用,在内存较低时将回收这些对象。
SoftReference和WeakReference类实现了引用对象,这两个类在java.lang.ref.包中。这两个类的主要区别是,垃圾收集器采用不同的算法来决定何时回收它们指向的对象。在实践中,这两个类可以相互替换,所以我将继续使用术语“引用对象”来指代两个中的任意一个。
要创建一个对象的弱引用,你要将对象传递给引用对象的构造器。一旦被创建,引用对象的弱引用是不可变的:它不能被修改,除了调用clear方法来清除此引用。
引用对象的get方法返回原来传递给引用对象构造器的对象,或者如果调用过clear方法,get方法将返回null。当一个对象仅可通过弱引用访问时,它将符合垃圾收集的条件。当垃圾收集器决定回收一个被弱引用的对象的内存时,将首先清除引用对象持有的所有指向此对象的弱引用,所以此时调用get方法将返回null,如同你自己调用了clear方法。