对象与垃圾回收

一个对象可以被一个方法的局部变量引用,也可以被其他类的类变量引用,或被其他对象的实例变量引用。当某个对象被其他类的类变量引用时,只有该类被销毁后,该对象才会进入可恢复状态;当某个对象被其他对象的实例变量引用时,只有当该对象被销毁后,该对象才会进入可恢复状态。


finalize()方法具有如下4个特点。
  • 永远不要主动调用某个对象的finalize()方法,该方法应交给垃圾回收机制调用。
  • finalize()方法何时被调用,是否被调用具有不确定性,不要把finalize()方法当成一定会被执行的方法。
  • 当JVM执行可恢复对象的finalize()方法时,可能使该对象或系统中其他对象重新变成可达状态。
  • 当JVM执行finalize()方法时出现异常时,垃圾回收机制不会报告异常,程序继续执行。

通知系统进行资源回收,但不一定立即执行回收。如下:
System.gc();
Runtime.getRuntime().gc();
强制垃圾回收机制调用可恢复对象的finalize()方法。如下:
Runtime.getRuntime().runFinalization();
System.runFinalization();


java.lang.ref包下有3个类:SoftReference(软引用)、PhantomReference(虚引用)、WeakReference(弱引用)。
当一个对象只有软引用时,它有可能被垃圾回收机制回收。对于只有软引用的对象而言,当系统内存空间不足时,系统封可能会回收它。软引用通常用于对内存敏感的程序中。
弱引用的引用级别比软引用低。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。当然并不是说当一个对象只有弱引用时,它就会立即被回收——正如那些失去引用的对象一样,必须等到系统垃圾回收机制运行时才会被回收。
虚引用完全类似于没有引用。虚引用对对象本身没有太大影响,对象甚至感觉不到虚引用的存在。如果一个对象只有一个虚引用时,那么它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列(ReferenceQueue)联合使用。
如果希望尽可能减小程序在其生命周期中所占用的内存大小时,这些引用类所提供的任何好处。
由于垃圾回收的不确定性,当程序希望从软、弱引用中取出被引用对象时,可能这个被引用对象已经被释放了。如果程序需要使用那个被引用的对象,则必须重新创建该对象。代码如下:

//取出弱引用所引用的对象
obj=wr.get()
//如果取出的对象为null
if(obj==null)
{
     //重新创建一个新的对象,并使用强引用来引用它
     obj=recreateIt();
     //取出弱引用所引用的对象,将其赋给obj变量
     wr=new WeakReference(obj);
}
...//操作obj对象
//再次切断obj和对象之间的关联
obj=null;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值