JVM源碼分析之System.gc()

簡(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 最近項(xiàng)目中遇到定期(一個(gè)小時(shí))發(fā)生Full gc的情況,經(jīng)過排查發(fā)現(xiàn)是sun.misc.GC的Daemon線...
    allanYan閱讀 1,035評(píng)論 0 1
  • System.gc整理 System.gc()源碼public static void gc() { Runtim...
    andersonoy閱讀 3,146評(píng)論 0 1
  • System.gc() 源碼解讀 簡(jiǎn)書 滌生[http://www.itdecent.cn/users/15...
    滌生YQ閱讀 4,272評(píng)論 2 13
  • 概述 JVM的GC一般情況下是JVM本身根據(jù)一定的條件觸發(fā)的,不過我們還是可以做一些人為的觸發(fā),比如通過jvmti...
    你假笨閱讀 2,634評(píng)論 1 5
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,644評(píng)論 2 7

友情鏈接更多精彩內(nèi)容