详细分析通过System.gc()触发GC的实现原理

JVM的垃圾回收机制是每一个Java开发者都必须掌握的知识,然而我们却很少直接发起GC。一般情况下GC是由JVM本身根据一定条件出发的,不过我们也可以人为的触发GC。今天就详细的介绍一下通过System.gc()方法人为的触发GC。

在讲System.gc()的实现原理之前我们先看看它的一些特点:

  • System.gc()会触发一次Full GC。
  • System.gc()会Stop The World。
  • 可以通过-XX:+DisableExplicitGC参数禁用掉System.gc()。
  • 可以通过-XX:+ExplicitGCInvokesConcurrent参数启用cms gc,让Full GC效率稍微高一点。

JDK中的System.gc()的实现代码

首先看看System.gc中的源码,很简单:

详细分析通过System.gc()触发GC的实现原理

然后看看Runtime.gc的代码,更加简单:

详细分析通过System.gc()触发GC的实现原理

从上面两段代码我们可以看出,System.gc()全部的实现逻辑都是在native代码中的,所以接下来我们就到native代码中看看。

Hotspot中的System.gc的实现

首先我们根据native方法的命名规则,找到Runtime.gc方法对应的native代码:

详细分析通过System.gc()触发GC的实现原理

再去看看JVM_GC函数的实现代码:

详细分析通过System.gc()触发GC的实现原理

从这段代码我们可以发现当-XX:+DisableExplicitGC被设置为1的时候,就不会去执行collect进行GC了。接下来我们再看看这个collect函数。

由于不同的GC策略实现的heap是不一样的,所以对应的collect也是有所不同的,这里我们以默认的heap的代码为例:

详细分析通过System.gc()触发GC的实现原理

在进行真正的collect之前,会判断一下是否需要concurrent full gc。如果需要就调用concurrent collect的函数,如果不需要,就直接调用collect进行普通的full gc。

然后我们看看collect_mostly_concurrent和collect主要代码:

详细分析通过System.gc()触发GC的实现原理

从这段代码我们可以知道,两种不同的GC方式就是创建了两个不同的VM_Operation,然后放到VMThread中去执行(VMThread里有一个轮询线程,找到需要被执行的operation,然后执行,实现原理以后在分析),实际上不仅仅是System.gc触发的GC是通过往VMThread中添加operation来处理的,JVM内部触发的GC也是通过类似的方式发起的。所以实际GC处理逻辑会在后续的文章中进行分析,本文主要分析System.gc()从调用到触发GC的全过程。

阿里云服务器

编辑该文章

编辑该文章,必须放入您本人的支付宝或微信收款码,通过审核后可,如果浏览者觉得您写的不错了直接对您打赏

复制加密链接

This is a modal dialog!

邮箱

This is a modal dialog!