1. 程式人生 > >Java記憶體垃圾回收(Garbage Collection)機制基本方法和原則:System.gc()與finalize()

Java記憶體垃圾回收(Garbage Collection)機制基本方法和原則:System.gc()與finalize()

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垃圾回收