您的位置: 濮阳信息港 > 金融

基于Java2平台的引用类使用指南3

发布时间:2019-11-05 05:36:35

现在我们假定垃圾收集器开始运行。由于 MyObject 对象没有被释放,所以 get() 和 poll() 方法将返回同样的值;obj 仍然保持对该对象进行强引用。实际上,对象布局还是没有改变,和图 1 所示的差不多。然而,请考虑下面的代码:

obj = null;System.gc();

//run the collector

在这段代码执行后,对象布局就如图 2 所示:

图 2. obj = null; 和垃圾收集器运行后的对象布局

498)this.style.width=498;">

现在,调用 get() 和 poll() 将产生与前面不同的结果:

wr.get();

//returns nullrq.poll();

//returns a reference to the WeakReference object

这种情况表明,MyObject 对象(对它的引用原来是由 WeakReference 对象进行的)不再可用。这意味着垃圾收集器释放了 MyObject 占用的内存,从而使 WeakReference 对象可以被放在它的 ReferenceQueue 上。这样,您就可以知道当 WeakReference 或 SoftReference 类的 get() 方法返回 null 时,就有一个对象被声明为 finalizable,而且可能(不过不一定)被收集。只有当 heap 对象完全结束而且其内存被回收后,WeakReference 或 SoftReference 才会被放到与其关联的 ReferenceQueue 上。清单 2 显示了一个完整的可运行程序,它展示了这些原理中的一部分。这段代码本身就颇具说明性,它含有很多注释和打印语句,可以帮助您理解。

清单 2. 展示引用类原理的完整程序

import java.lang.ref.*;

class MyObject{ protected void finalize() throws Throwable {

System.out.println("In finalize method for this object: " +

this); }}class ReferenceUsage{ public static void main(String args[]) {hold();

release();

} public static void hold() {

System.out.println("Example of incorrectly holding a strong " +

"reference");

//Create an object

MyObject obj = new MyObject();

System.out.println("object is " + obj);

//Create a reference queue

ReferenceQueue rq = new ReferenceQueue();

//Create a weakReference to obj and associate our reference queue

WeakReference wr = new WeakReference(obj, rq);

System.out.println("The weak reference is " + wr);

//Check to see if it's on the ref queue yet

System.out.println("Polling the reference queue returns " +

rq.poll());

System.out.println("Getting the referent from the " +

"weak reference returns " + wr.get());

System.out.println("Calling GC");

System.gc();

System.out.println("Polling the reference queue returns " +

rq.poll());

System.out.println("Getting the referent from the " +

"weak reference returns " + wr.get());

} public static void release() {

System.out.println("");

System.out.println("Example of correctly releasing a strong " +

"reference");

//Create an object

MyObject obj = new MyObject();

System.out.println("object is " + obj);

//Create a reference queue

ReferenceQueue rq = new ReferenceQueue();

//Create a weakReference to obj and associate our reference queue

WeakReference wr = new WeakReference(obj, rq);

System.out.println("The weak reference is " + wr);

//Check to see if it's on the ref queue yet

System.out.println("Polling the reference queue returns " +

rq.poll());

System.out.println("Getting the referent from the " +

"weak reference returns " + wr.get());

System.out.println("Set the obj reference to null and call GC");

obj = null;

System.gc();

System.out.println("Polling the reference queue returns " +

rq.poll());

System.out.println("Getting the referent from the " +

"weak reference returns " + wr.get()); }}

成都恒博医院预约挂号
小米熊医院周德凯
贵阳治疗癫痫病医院
九江哪家医院治牛皮癣
惠州治疗性病的医院
猜你会喜欢的
猜你会喜欢的