如何判断一个对象是否应该被回收?

 采用引用计数法和可达性分析两种方法来判断一个对象是否应该被回收

引用计数法:

可以通过引用计数法来判断一个对象是否可以被回收。在为对象添加一个引用时,引用计数加1;在为对象删除一个引用时,引进计数减1;如果一个对象的引用计数为0,则表示此刻该对象没有被引用,可以被回收。

引用计数法可能存在循环引用的问题,所以一般不用引用计数法,而是用可达性分析法

可达性分析法:

首先定义一些GC Roots对象,然后以这些GC Roots对象作为起点向下搜索,如果在GC roots和一个对象之间没有可达路径,则称该对象是不可达的。不可达对象要经过至少两次标记才能判定其是否可以被回收,如果在两次标记后该对象仍然是不可达的,则将被垃圾收集器回收。

如下图,橙色的表示和GC Root 之间没有可达路径的对象(需要回收的对象),白色的表示和GC Root之间有可达路径的对象

哪些对象可以作为GC ROOT呢?

主要有以下几种:

1. 虚拟机栈引用的对象

2. 处于存活状态的线程对象

3. 方法区静态引用的对象

4. 本地native方法jni引用的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值