Java記憶體垃圾回收(Garbage Collection)機制基本方法和原則:System.gc()與finalize()
阿新 • • 發佈:2018-12-09
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垃圾回收