在Java虚拟机的垃圾回收器看来,堆区中的每个对象可能处于以下三个状态之一
可触及状态:当一个对象(假定为simple)被创建后,只要程序中还有引用变量引用它,那么它就处于可触及状态
可复活状态:当程序中不再有任何引用变量引用simple对象时,它就进入可复活状态。在这个状态中。垃圾回收器会准备释放它的资源,在释放之前,会调用它的或者其他处于可复活状态的对象的finalize()方法,这些finalize()方法有可能使对象重新转到可触及状态
不可触及状态:执行完finalize()方法后,如果没有使simple对象进入可触及状态,那么simple对象就进入不可触及状态。处于不可触及状态的对象,垃圾回收器会回收内存。
垃圾回收的时间
在程序中可以调用system.gc()或者Runtime.gc()方法提示垃圾回收器尽快的执行垃圾回收操作,但是这也不能保证调用该方法后,垃圾回收线程立即执行回收操作。
对象的finalize()方法的特点
(1) 垃圾回收器是否会执行该方法及什么时候执行该方法都是不确定的。
(2) Finalize()方法有可能使对象复活,使它处于可触及状态
(3) 垃圾回收器在执行finalize()方法时,如果出现异常,垃圾回收器不会报告异常,程序继续正常运行
具有实例缓存的不可变类
在jdk1.5的基本类库中,对一些不可变类,如Integer类做了优化,它具有一个实例缓存,用来存放程序中经常使用的Integer实例。JDK1.5的Integer类新增了一个参数,为int类型的静态工厂方法valueOf(int i),它的处理流程如下:
If ( 在实例缓存中存在取值为i 的实例){
直接返回这个类型
}
Else{
用new 语句创建一个取值为i 的Integer实例
把这个实例存放在实例缓存中
返回这个实例
}