簡(jiǎn)書 占小狼
轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!

System.gc()是觸發(fā)FGC最簡(jiǎn)單暴力的方式,在JDK源碼中實(shí)際上是調(diào)用了Runtime的gc方法
public static void gc() {
Runtime.getRuntime().gc();
}
Runtime.gc的底層實(shí)現(xiàn)位于Runtime.c文件中
JNIEXPORT void JNICALL
Java_java_lang_Runtime_gc(JNIEnv *env, jobject this)
{
JVM_GC();
}
其中JVM_GC()的實(shí)現(xiàn)位于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
這里有一個(gè)DisableExplicitGC參數(shù),默認(rèn)是false,如果啟動(dòng)JVM時(shí)添加了參數(shù)-XX:+DisableExplicitGC,那么JVM_GC相當(dāng)于一個(gè)空函數(shù),并不會(huì)進(jìn)行GC。
其中Universe::heap()返回當(dāng)前堆對(duì)象,由collect方法開始執(zhí)行GC,并設(shè)置當(dāng)前觸發(fā)GC的條件為_java_lang_system_gc,內(nèi)部會(huì)根據(jù)GC條件執(zhí)行不同邏輯。
JVM的具體堆實(shí)現(xiàn),在Universe.cpp文件中的initialize_heap()由啟動(dòng)參數(shù)所設(shè)置的垃圾回收算法決定。

堆實(shí)現(xiàn)和回收算法對(duì)應(yīng)關(guān)系:
1、UseParallelGC:ParallelScavengeHeap
2、UseG1GC:G1CollectedHeap
3、默認(rèn)或者CMS:GenCollectedHeap