java-JVM中对象判活

我们对java有了解的都知道,当一个对象没有引用指向它时,虚拟机会在GC的时候会回收掉分配的内存,其实这样说是不准确的,下面我就详细的说一下,虚拟机是怎么样判断一个对象还是活着的,即对象判活问题,当我们遇到这样一个问题,这样判断一个对象上的引用的,我相信大家很快都会想到引用计数法,那么什么是引用计数法呢?
引用计数法
通过一个数值来记录对象上被引用的数量,当数值为0时,我们认为这个对象的内存空间是可以回收的,这种方法会遇到一种很难解决的情况,就是循环引用,即A对象有B的引用,而B有A的引用,其实A已经没有用了,因为B有对他的引用,所以不能回收,而B也是这样的情况,这样就无法回收AB 的内存。这是这种方法的弊端,而实际上JVM不是使用的这种方法。
可达性判别法
JVM设计者根据类加载的特点,提出了可达性判别法,那么什么是可达的,而什么是不可达的,也提出了标准。认为对象之间引用是一个树形结构,规定出几种可以做root的对象,从这些对象遍历,如果不存在路径到达这个对象,我们认为这个对象是不可达的,也就是内存可以回收。但也不是一定会立即回收掉,只是把它放在回收队列里,等待GC,这时候如果有一个引用指向它,那么还是可以回到可达性队列的。
在java语言中,可作为GC roots的对象包括下面几种:
1.虚拟机栈中引用的对象
2.方法区中类静态属性引用的对象
3.方法区常量引用的对象
4.本地方法栈中JNI引用的对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值