今天開始實戰Java虛擬機之四:"禁用System.gc()"。
總計有5個系列
- 實戰Java虛擬機之一“堆溢出處理”
- 實戰Java虛擬機之二“虛擬機的工作模式”
- 實戰Java虛擬機之三“G1的新生代GC”
- 實戰Java虛擬機之四“禁用System.gc()”
- 實戰Java虛擬機之五“開啟JIT編譯”
默認情況下,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