GC 可达性分析算法

在主流的商用程序语言的主要实现中,都是称通过可达性分析(Reachability Analysis)来判定对象是否存活的,这个算法的基本思路就是通过一系列的称为“GC Roots“的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路程成为引用链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。

在Java语言中,可作为 GC Roots 的对象包括下面几种:

  • 虚拟机栈(栈帧中的局部变量表)中引用的对象。(即Java方法中局部变量引用的对象)
  • 方法区中类静态属性引用的对象。(即类的静态变量引用的对象)
  • 方法区中常量引用的对象。(即类的常量引用的对象)
  • 本地方法栈中 JNI 引用的对象。(即 Native 方法中局部变量引用的对象)

 

虚拟机栈:

虚拟机栈的生命周期与线程相同,是线程私有的。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法从调用到执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

 

方法区:

方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

 

本地方法栈:

本地方法栈与虚拟机栈所发挥的作用是相似的,他们之间的区别在于虚拟机栈为虚拟机执行 Java 方法服务,而本地方法栈则为虚拟机使用到的 Native 方法服务(说白了,就是在虚拟机执行 Native 方法时,用来保存 Native 方法内的局部变量等信息)。

 

 

 


有一个疑问:为什么Java类的普通变量不能作为 GC Roots 的对象?

在对虚拟机整体有一个大致了解之后,这个问题有了答案:所有通过 new 关键字创建的对象全部保存到 Java堆,而对对象的引用几乎全部位于虚拟机栈中,这样就能通过虚拟机栈的局部变量表找到该对象,若该对象的普通成员变量又引用了另外一个对象,这仍然是一条完整的 GC Roots 引用链。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值