Java内存垃圾回收(Garbage Collection)机制基本方法和原则:System.gc()与finalize()
Java一个对象的finalize()函数,是在当前对象被回收时才会调用。System.gc()暗示和提醒JVM开始垃圾回收。Java程序中显示调用System.gc() 搭配 Runtime.getRuntime().gc(),JVM并不一定马上就进行垃圾回收。这些方法实际上只是建议与提醒JVM该进行垃圾回收了,但是JVM到底做或者不做垃圾回收,JVM会自己决定(JVM判断的重要原则是Heap Space剩余大小)。
简单的说,System.gc()只是给了JVM一个垃圾回收的提醒:“嗨,可以垃圾回收了!”,至于JVM是否真的进行垃圾回收,JVM后续行为是不可预测的。JVM可以接受建议回收垃圾,也可以拒绝垃圾回收,即垃圾回收的时机不由System.gc()决定。JVM收到System.gc()垃圾回收提醒,到JVM真正进行垃圾回收动作是有时间延迟的。程序代码中调用System.gc()之后,JVM可能不会立即垃圾回收,但是JVM垃圾回收时候,会回收之前调用System.gc()的垃圾。
例如代码:
public class MainClass {
public static void main(String[] args) {
GCClass g = new GCClass();
// 创建一个Java类,但是立即置为null。没有任何引用。
g = null;
// 此处专门开辟一个线程,模拟程序在进行其他一些有意义的活动。
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
System.gc();
System.runFinalization();
}
private static class GCClass {
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println(this.getClass().getSimpleName() + "垃圾回收");
}
}
}
运行后输出:
GCClass垃圾回收