2021-05-22 14:25  阅读(1800)
文章分类:JVM 源码分析 文章标签:JVMJVM 源码
©  原文作者:狼哥 原文地址:https://www.jianshu.com/u/90ab66c248e6

202105221425558311.png

System.gc()是触发FGC最简单暴力的方式,在JDK源码中实际上是调用了Runtime的gc方法

        public static void gc() {
            Runtime.getRuntime().gc();
        }
    

Runtime.gc的底层实现位于Runtime.c文件中

        JNIEXPORT void JNICALL
        Java_java_lang_Runtime_gc(JNIEnv *env, jobject this)
        {
            JVM_GC();
        }
    

其中JVM_GC()的实现位于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
    

这里有一个DisableExplicitGC参数,默认是false,如果启动JVM时添加了参数-XX:+DisableExplicitGC,那么JVM_GC相当于一个空函数,并不会进行GC。

其中Universe::heap()返回当前堆对象,由collect方法开始执行GC,并设置当前触发GC的条件为_java_lang_system_gc,内部会根据GC条件执行不同逻辑。

JVM的具体堆实现,在Universe.cpp文件中的initialize_heap()由启动参数所设置的垃圾回收算法决定。

202105221425568192.png

堆实现和回收算法对应关系:
1、UseParallelGC:ParallelScavengeHeap
2、UseG1GC:G1CollectedHeap
3、默认或者CMS:GenCollectedHeap

微信公众号

202105221425579083.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> JVM源码分析之System.gc()
上一篇
JVM源码分析之跨代引用CardTable
下一篇
JVM源码分析之GC locker深度分析