今天開始實戰Java虛擬機之四:「禁用System.gc()」。java
總計有5個系列app
實戰Java虛擬機之五「開啓JIT編譯」.net
默認狀況下,System.gc()會顯式直接觸發Full GC,同時對老年代和新生代進行回收。而通常狀況下咱們認爲,垃圾回收應該是自動進行的,無需手工觸發。若是過於頻繁地觸發垃圾回收對系統性能是沒有好處的。所以虛擬機提供了一個參數DisableExplicitGC來控制是否手工觸發GC。code
System.gc()的實現以下所示:orm
Runtime.getRuntime().gc();
Runtime.gc()是一個native方法,最終實如今jvm.cpp中,以下所示:ci
JVM_ENTRY_NO_ENV(void, JVM_GC(void)) JVMWrapper("JVM_GC"); if (!DisableExplicitGC) { Universe::heap()->collect(GCCause::_java_lang_system_gc); } JVM_END
能夠看到,若是設置了-XX:-+DisableExplicitGC,條件判斷就沒法成立,那麼就會禁用顯式GC,使得System.gc()等價於一個空函數調用。
節選自
《實戰Java虛擬機》一書Q交流羣:397196583