JVM源码分析之System.gc()

简书 占小狼
转载请注明原创出处,谢谢!

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()由启动参数所设置的垃圾回收算法决定。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 最近项目中遇到定期(一个小时)发生Full gc的情况,经过排查发现是sun.misc.GC的Daemon线...
    allanYan阅读 932评论 0 1
  • System.gc整理 System.gc()源码public static void gc() { Runtim...
    andersonoy阅读 2,986评论 0 1
  • System.gc() 源码解读 简书 涤生[https://www.jianshu.com/users/15...
    涤生YQ阅读 4,040评论 2 13
  • 概述 JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti...
    你假笨阅读 2,514评论 1 5
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,106评论 2 7