对象的可触及性

本文介绍Java中垃圾回收机制的工作原理,包括对象的三种状态:可触及、可复活和不可触及状态,并探讨垃圾回收时机及finalize()方法的作用。此外,还详细解释了JDK1.5中Integer类的优化策略,即实例缓存机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Java虚拟机的垃圾回收器看来,堆区中的每个对象可能处于以下三个状态之一

 

可触及状态:当一个对象(假定为simple)被创建后,只要程序中还有引用变量引用它,那么它就处于可触及状态

可复活状态:当程序中不再有任何引用变量引用simple对象时,它就进入可复活状态。在这个状态中。垃圾回收器会准备释放它的资源,在释放之前,会调用它的或者其他处于可复活状态的对象的finalize()方法,这些finalize()方法有可能使对象重新转到可触及状态

不可触及状态:执行完finalize()方法后,如果没有使simple对象进入可触及状态,那么simple对象就进入不可触及状态。处于不可触及状态的对象,垃圾回收器会回收内存。

 

 

 

垃圾回收的时间

在程序中可以调用system.gc()或者Runtime.gc()方法提示垃圾回收器尽快的执行垃圾回收操作,但是这也不能保证调用该方法后,垃圾回收线程立即执行回收操作。

 

 

 对象的finalize()方法的特点

(1) 垃圾回收器是否会执行该方法及什么时候执行该方法都是不确定的。

(2) Finalize()方法有可能使对象复活,使它处于可触及状态

(3) 垃圾回收器在执行finalize()方法时,如果出现异常,垃圾回收器不会报告异常,程序继续正常运行

 

具有实例缓存的不可变类

jdk1.5的基本类库中,对一些不可变类,如Integer类做了优化,它具有一个实例缓存,用来存放程序中经常使用的Integer实例。JDK1.5Integer类新增了一个参数,为int类型的静态工厂方法valueOf(int i),它的处理流程如下:

If ( 在实例缓存中存在取值为i 的实例){

       直接返回这个类型

}

Else{

       new 语句创建一个取值为i Integer实例

       把这个实例存放在实例缓存中

       返回这个实例

}              

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值