理解Java虚拟机(三)如何判断对象已死

  对象已死指不可能再被任何途径使用的对象。

  垃圾收集器主要关注3个问题:哪些内存需要回收?什么时候回收?如何回收?本篇就是对第一个问题的回答。

一、回收的区域

  程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,内存多少根据类结构是已知的,内存分配和回收具备确定性。

  Java堆和方法区两个区域不确定性。只有处于运行期间,我们才能知道程序究竟会创建哪些对象,多少个对象,这部分内存的分配和回收是动态的。垃圾收集器所关注的正是这部分内存该如何管理。

二、判断对象已死的算法

2.1 引用计数算法

  在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器就减一;任何时刻计数器为零的对象就是不可能再被使用的。

  原理简单,判断效率也很高。但需要配合大量额外的处理才能保证工作,比如无法解决对象之间相互循环引用的问题。 比如:对象A和对象B都有字段instance,赋值令A.instance=B, B.instance=A,除此之外,再出引用,但它们互相引用着,计数不为零,如果用引用计数算法,则无法回收。

2.2 可达性分析算法

  通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,则

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值