专栏首页JVMGC什么是GC Roots
原创

什么是GC Roots

可达性算法中以GC Root对象为起点开始搜索。

img

什么是GC Root对象

虚拟机栈中引用的对象

public class Rumenz{
    public static  void main(String[] args) {
	     Rumenz a = new Rumenz();
	     a = null;
    }

}

a是栈帧中的本地变量,a就是GC Root,由于a=null,a与new Rumenz()对象断开了链接,所以对象会被回收。

方法区类的静态成员引用的对象

public class Rumenz{
    public static Rumenz=r;
    public static void main(String[] args){
       Rumenz a=new Rumenz();
       a.r=new Rumenz();
       a=null;
    }
}

栈帧中的本地变量a=null,由于a断开了与GC Root对象(a对象)的联系,所以a对象会被回收。由于给Rumenz的成员变量r赋值了变量的引用,并且r成员变量是静态的,所以r就是一个GC Root对象,所以r指向的对象不会被回收。

方法区常量引用的对象

public class Rumenz{
    public static final Rumenz r=new Rumenz();
    public static void main(String[] args){
       Rumenz a=new Rumenz();
       a=null;
    }
  
}

常量r引用的对象不会因为a引用的对象的回收而被回收。

本地方法栈中JNI引用的对象

JNIEXPORT void JNICALL Java_com_pecuyu_jnirefdemo_MainActivity_newStringNative(JNIEnv *env, jobject instance,jstring jmsg) {
...
   // 缓存String的class
   jclass jc = (*env)->FindClass(env, STRING_PATH);
}
7

本地方法就是一个 java 调用非 java 代码的接口,该方法并非 Java 实现的,可能由 C 或 Python等其他语言实现的, Java 通过 JNI 来调用本地方法, 而本地方法是以库文件的形式存放的(在 WINDOWS 平台上是 DLL 文件形式,在 UNIX 机器上是 SO 文件形式)。通过调用本地的库文件的内部方法,使 JAVA 可以实现和本地机器的紧密联系,调用系统级的各接口方法,

当调用 Java 方法时,虚拟机会创建一个栈桢并压入 Java 栈,而当它调用的是本地方法时,虚拟机会保持 Java 栈不变,不会在 Java 栈祯中压入新的祯,虚拟机只是简单地动态连接并直接调用指定的本地方法。

wx.jpg

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • GC是什么?为什么要有GC?

    GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象...

    唐怀瑟
  • 六、jvm之如何判断对象已死?

    在堆里面几乎存放中Java程序运行所动态生成的所有对象,垃圾回收器在对堆进行回收前,第一件事情就是要确定这些对象之中还有哪些存活,哪些已经死去(即不可能再被任何...

    栋先生
  • 对象的最后一次救赎

    我们都知道当堆内存不够用的时候,会进行垃圾回收,回收的则是对象,那么哪些对象会被作为”垃圾“被回收呢?

    用户7386338
  • JVM技术总结之二——GC机制

    GC 的机制是什么?垃圾回收器的基本原理是什么?是否可以立即回收内存?怎么样主动的通知 JVM 进行垃圾回收?

    剑影啸清寒
  • 昨天乔戈里被北京沙尘暴重拳出击,今天已经更新热腾腾的腾讯二三面面经!(带答案)

    昨天北京沙尘暴,当时下班正好熬过了沙尘暴,于是准备回去,结果刚骑车走了没两步,就下起了雨,下雨就下雨吧,关键是泥雨,于是就成了这幅样子(一幅生无可恋的样子呀)。...

    乔戈里
  • 白话说java gc垃圾回收

    gc是java区别于其他好几门语言(c/c++)的一个代表功能(当然也有很多可以自动管理内存的语言,如所有的脚本语言,你根本不知道内存管理这回事)!

    烂猪皮
  • 内存泄漏

    垃圾收集器(Garbage Collector)简称GC,在Java内存管理中担当重要角色,Java内存管理器使用GC定期定期清理无引用的内存空间,不像C++智...

    小海编码日记
  • JVM垃圾回收算法实现的方式

      通过前面的介绍我们清楚了JVM中对象是如何判断存活及垃圾回收算法。那么垃圾回收的算法到底是怎么实现的呢?因为HotSpot虚拟机在对对象回收的时候对执行的效...

    用户4919348
  • 哪些情况下的对象会被垃圾回收机制处理掉

    Java的虚拟机本身是蛮复杂的,我们不仔细讲细节。我们只针对我们平时最关心的堆中的哪些对象会被GC回收。我们这样思考,既然GC要回收这块内存,那总得有个方法让G...

    吴延宝
  • jvm垃圾回收之引用计数算法和可达性分析算法(判断对象是否存活算法

    什么是引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1,引用数量为0的时候,则说明对象没有被任何引用指...

    黎明大大
  • JVM如何判断哪些对象可以回收?

    我们上一篇分析的是JVM的内存分布,分为堆内存、虚拟机栈、本地方法栈、方法区以及程序计数器等主要区域;各个区域的特点我也就不啰嗦了,想看的给大家直通车:

    Java宝典
  • JVM系列--彻底搞清楚怎么确定一个对象是垃圾对象?

    类的声明周期和对象的声明周期。关于类的声明周期请看:JVM系列——java文件到JVM中的整个过程

    田维常
  • 【JVM从小白学成大佬】4.Java虚拟机何谓垃圾及垃圾回收算法

    在Java中内存是由虚拟机自动管理的,虚拟机在内存中划出一片区域,作为满足程序内存分配请求的空间。内存的创建仍然是由程序猿来显示指定的,但是对象的释放却对程序猿...

    猿人谷
  • 探索ParNew和CMS垃圾回收器

    上篇文章我们一起分析了JVM的垃圾回收机制,了解了新生代的内存模型,老年代的空间分配担保原则,并简单的介绍了几种垃圾回收器。详细内容小伙伴们可以去看一下我的上篇...

    HUC思梦
  • Java垃圾回收的细节

    大家都知道 java 的垃圾回收机制,java有自己的垃圾回收器来自动回收垃圾。本人对于垃圾回收机制以前也就知道java的垃圾回收器是自动回收垃圾的,有这么回事...

    矿泉水
  • Java垃圾回收的细节

    大家都知道 java 的垃圾回收机制,java有自己的垃圾回收器来自动回收垃圾。本人对于垃圾回收机制以前也就知道java的垃圾回收器是自动回收垃圾的,有这么回事...

    用户2141593
  • 雷锋教你阿里面试题(HotSpot的算法实现)

    我们今天说一下hotspot的算法实现,我先将回顾一下我们几个知识点.如何判断对象已经可回收了,即不可能再被任何途径使用这些对象.

    小土豆Yuki
  • JVM垃圾回收机制

    JVM垃圾回收机制是java程序员必须要了解的知识,对于程序调优具有很大的帮助(同时也是大厂面试必问题)。

    Liusy
  • 就写了一行代码,被问了这么多问题

    小白:(是不是太基础了,暗笑)byte[] arrays = new byte[1024]。

    JavaQ

扫码关注云+社区

领取腾讯云代金券