Java的垃圾收集器使用了分代垃圾收集策略,这是基于这样一个假设:不同的对象的生命周期是不一样的。因此,我们可以根据对象的生命周期长短,将对象分为不同的代(generation)。
Java中的垃圾收集器将对象分为三个代:年轻代(Young Generation)、老年代(Old Generation)和永久代(Perm Generation,在Java 8中被元数据区取代)。
-
年轻代(Young Generation):新创建的对象都存放在这里。
-
老年代(Old Generation):年轻代中经过几次垃圾收集仍然存活的对象会被移动到这里。
-
永久代/元数据区(Perm Generation):存放Java类的元数据等信息。
常见的垃圾收集器包括:
-
Serial GC:用于新生代,简单的标记-整理算法。
-
Parallel GC:用于新生代,标记-整理算法,注重吞吐量。
-
CMS GC(Concurrent Mark Sweep):用于老年代,基于标记-清除算法,注重低暂停。
-
G1 GC:用于整heap,混合了标记-整理和复制算法,注重低暂停和高吞吐量。
以下是一个简单的Java程序,用于演示如何创建对象并通过垃圾收集器进行垃圾回收:
public class GarbageCollectionExample {public static void main(String[] args) {// 创建一个新对象Object object = new Object();// 取消引用,使得对象符合垃圾收集的条件object = null;// 显式触发垃圾收集,但实际上不一定会立即发生System.gc();}
}
在这个例子中,我们创建了一个新的Object对象,然后将它的引用设置为null,这样这个对象就不再被任何活动线程引用,符合垃圾收集的条件。然后我们调用了System.gc()
方法,通知JVM执行垃圾收集,但是具体何时发生垃圾收集是不确定的,取决于JVM的垃圾收集策略和运行环境。