JVM-可达性分析

jvm中判断对象是否存活的方法

1、引用计数

2、可达性分析

1、什么是引用计数?

每个对象自身持有一个计数器,每当对象被一个地方引用,计数器便+1;当引用失效时,计数器-1。当对象的计数器为0时,该对象便是一个不被使用的对象,即“死亡”。
引用计数器实现简单,效率高。然而难以解决对象之间相互循环引用的问题(两个失效对象相互保存了对方的指针)。故JVM判定对象是否存活,并没有使用引用计数器,而是使用可达性分析算法。

2、什么是可达性分析

可达性分析算法即:有一系列“GCRoots”起点,从这些点开始向下搜索,走过的路径称为“引用链”。若一个对象没有任何引用链可到达GC Roots,那么该对象就是不可用的,即使该对象还与其他对象相关联。
经可达性分析算法所标记出的对象,会进行一次筛选(根据finalize方法)。若经过筛选,判定可回收,那么就会立即回收;若判定没有必要回收,那么就将对象放入F-Queue队列中,进行二次筛查。二次筛查会执行对象的finalize()方法。若对象在这个过程重新与引用链上的任何一个对象建立关联,那么该对象就会从回收集合中移除。否则,对象会被回收。

3、哪些对象可以作为GCRoots的起点呢?

要了解这个问题首先需要了解一下JMM是怎么回事
从JMM中不难发现Head区主要是保存实例对象的区域,那么哪些地方会引用这些对象呢?
答案呼之欲出了,那就是其区域中含有引用对象地方,这些地方是,栈中引用的对象(包括虚拟机栈和本地方法栈),方法区中的一些静态属性引用的对象 ,常量引用的对象。
综上所述,可作为GC Roots的对象包含:
① 虚拟机栈中引用的对象
② 方法区中类静态属性引用的对象
③ 方法区中常量引用的对象
④ 本地方法栈中引用的对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值