在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实例

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

       返回这个实例

}              

 

 

 

  • Cd529ec8-4696-3a1b-8281-7aefa25e61bc-thumb
  • 描述:
  • 大小: 24.3 KB
评论
lijunxiangjava 2008-01-02
hello
发表评论

您还没有登录,请登录后发表评论

lijunxiangjava
搜索本博客
最近加入圈子
存档
最新评论