今天開始實戰Java虛擬機之四:"禁用System.gc()"。
總計有5個系列
默認情況下,System.gc()會顯式直接觸發Full GC,同時對老年代和新生代進行回收。而一般情況下我們認為,垃圾回收應該是自動進行的,無需手工觸發。如果過于頻繁地觸發垃圾回收對系統性能是沒有好處的。因此虛擬機提供了一個參數DisableExplicitGC來控制是否手工觸發GC。
System.gc()的實現如下所示:
Runtime.getRuntime().gc();
Runtime.gc()是一個native方法,最終實現在jvm.cpp中,如下所示:
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
新聞熱點
疑難解答