3.2对象已死?

3.2对象已死?

1、对象死亡判定

①引用计数算法:在对象里添加一个引用计数器。每当有一个地方引用它时计数器加一;当引用失效时计数器减一;任何时候当计数器值为零时对象被判定为死亡


优点:原理简单,判定效率高

缺点:无法解决两个本应该死亡的对象间相互引用的问题

②可达性分析算法:通过一系列称为“GC ROOT”的根对象节点集,通过引用关系向下搜索,搜索过程中通过的路径称为“引用链”如果某个对象没有通过引用链与根节点相连接(即图论中的不可达),则证明此对象已经不能被使用

在JAVA技术体系中可固定作为GC ROOT 的 对象

——在虚拟机栈中引用的对象(当前正在运行的方法所使用的参数,局部变量,临时变量。。。)

——在方法区中类经他属性引用的对象(java类的引用类型静态变量)

——在方法区中常量引用的对象(字符常量池里的引用)

——在本地方法栈中JNI引用的对象

——JAVA虚拟机内部的引用(基本数据类型对应的Class对象,一些常驻的异常对象,系统类加载器)

——所有被同步锁持有的对象

——反应Java虚拟机内部情况的JMXBean、JVMMTI中注册的回调、本地代码缓存等

除了上述固定的GCROOT集合以外,根据用户所选的垃圾收集器以及当前回收的内存区域不同还可以有其他对象“临时性”的加入,共同构建完整的GCROOT集合、

2、引用的分类

JDK1.2版本之后,Java对引用的概念进行了扩充,将引用分为了强引用、软引用、弱引用、虚引用四种,这四种引用强度依次减弱。

强引用:是最传统的引用的定义(Object o = new Object();),无论何种情况下、只要强引用关系还在,垃圾回收器就不会回收掉被引用的对象。

软引用:软引用用来藐视一些还有用,但非必须的对象,当系统即将要发生内存溢出异常前,会把软引用的对象列进回收范围之中进行二次回收。

弱引用:弱引用也是用来描述那些非必须的对象,但是强度回避软引用在弱一点,被弱引用的对象只能生存到下一次垃圾收集发生为止。

虚引用:最弱的一种引用关系,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例,其唯一的作用就是在对象被回收时收到一个系统通知。

3、对象的死亡

要真正地宣告一个对象的死亡需要进行两次标记过程,如果对象在进行一次可达性分析后并没有与根节点链接,那他会被第一次进行标记,随后进行一次筛选筛选条件时该对象是否有必要执行finalize()方法,如果该对象并没有继承finalize()方法或者finalize()已经被执行且在执行中没有逃脱(即在finalize方法中将该对象与引用链上的对象相连接,这是对象逃脱死亡命运的最后一次机会),则该对象在下次gc会被回收。

4、回收方法区

方法区的垃圾回收的性价比通常比较低,主要是用来回收废弃的常量和不再使用的类型

判定一个类型是否属于不在使用,需要同时满足以下三个条件

——该类型的所有实例都已经被回收了

——加载该类型的加载器已经被回收了(很难达成)

——该类对应的java.lang.class对象没有在任何敌方被引用,无法在任何地方通过反射访问该类的方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值