Java垃圾回收System.gc()的理解
阿新 • • 發佈:2020-07-22
System.gc()無法保證GC一定執行
- 在預設情況下,通過System.gc()或者Runtime.getRuntime().gc()的呼叫,會顯式觸發Full GC,同時對老年代和新生代進行回收,嘗試釋放被丟棄物件佔用的記憶體。
- JVM實現者可以通過system.gc()呼叫來決定JVM的GC行為。而一般情況下,垃圾回收應該是自動進行的,無須手動觸發,否則就太過於麻煩了。
- 然而System.gc()呼叫附帶一個免責宣告,無法保證對垃圾收集器的呼叫(無法保證馬上觸發GC)。
在一些特殊情況下,如我們正在編寫一個性能基準,我們可以在執行之間呼叫System.gc()。以下示例程式碼:
System.runFinalization();//強制呼叫 失去引用的物件的finalize()方法
public class SystemGCTest { public static void main(String[] args) { new SystemGCTest(); System.gc();//提醒jvm的垃圾回收器執行gc,但是不確定是否馬上執行gc //與Runtime.getRuntime().gc();的作用一樣。 System.runFinalization();//強制呼叫 失去引用的物件的finalize()方法} @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("SystemGCTest 重寫了finalize()"); } }
如果注掉System.runFinalization(); 那麼控制檯不保證一定列印,
從而證明了System.gc()無法保證GC一定執行.