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一定執行.