JVM源码分析之System.gc()

作者: 美团Java | 来源:发表于2017-07-02 16:29 被阅读2789次

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

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


微信公众号


相关文章

网友评论

  • ba442504df91:System.gc()是触发FGC最简单暴力的方式,在JDK源码中实际上是调用了Runtime的gc方法。
    ----------------------
    写错了吧,System.gc()只是建议JVM进行FGC,不会直接触发FGC,可能根本就不会触发。
  • tianlang136520:小狼,咨询个问题,jvm采用并行垃圾收集器,old gc 在回收时,是不是会有内存碎片?
    美团Java:@R米 只有cms有内存碎片问题
  • 大沈投资笔记:小狼,你以后职业规划是啥?
  • tianlang136520:小狼通过啥分析到的源码?我困惑在启动参数配置阶段了...
  • 老衲用清扬:是有些短,但是C++看起来很吃力
    美团Java:@老衲用清扬 铁棒磨成针
  • 9e65b3ce26b9:写滴真好
    美团Java:@可可爱吃巧克力 写的有点短

本文标题:JVM源码分析之System.gc()

本文链接:https://www.haomeiwen.com/subject/aconcxtx.html