尝试解读一下helpGC

在阅读JUC源码的时候,时不时能看到//help GC这样的注释

blog-helpGC

起初读到这里就在思考,怎么就help GC了?我就一个赋值操作就可以help GC?怎么个help方法,素质三连之后发现并没有啥想法也就不了了之了。

之后,当我重读《深入理解Java虚拟机》的时候,当读到GC Roots节点的时候回想到了这个help GC的问题,思考会不会是因为GC Roots的原因呢?

相信大家都知道GC Roots也知道什么对象可以做为GC Roots

  • 虚拟机栈中引用的对象
  • 方法区中常量引用的对象
  • 方法区中静态属性引用的变量
  • 本地方法栈中native方法引用的对象

反正我最开始在看到这里的时候就是小笔一划,小圈一画也就直接往下继续看了,理解全靠死记硬背。

这里拿常量举例来说,如果它不作为GC Roots的话,那么就需要有一个更上层的GC Roots来指向它,那么这个更上层的节点又会是谁呢?想了想好像找不出来,反证法也得出常量需要是GC Roots节点。

再来说说help GC,现在想一想,栈中对象的生命周期和该方法的生命周期一样长,而常量和静态属性则在类加载过程的“准备”阶段就已经加载进JVM中,其生命周期和类的生命周期一样长应该是整个JVM期间,native方法不知道但猜测应该是和常量/静态属性一样。既然说常量的生命周期和类的生命周期一样长,那么常量所引用的对象不使用后如果不显示的置NULL,岂不造成内存泄漏?想想似乎ThreadLocalMap中ThreadLocal设为弱引用好像也是基于此。

而上文中的示例,栈中引用的对象如果不显示的塞NULL值,那么在整个方法的运行过程中其一直存在,然后eden区就满了,显示的塞NULL后在GC过程中由于该节点是GC Roots节点,那么很快就会被标记到既而成功清除

而后在继续度娘的过程中发现了这样一篇文章,顿时发现实践是检验真理的唯一标准啊,膜拜大佬。

其实到这里,通过超链的文章已经证实了确实是有help GC,但是至于究竟怎么个help法还是不是特别的透彻,不过这正是学习的乐趣不是吗?


尝试解读一下helpGC
http://yuyangblog.cn/2019/09/10/尝试解读一下helpGC/
Aŭtoro
于洋
Postigita
September 10, 2019
Lizenta