科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件基于Java 2平台的引用类使用指南(3)

基于Java 2平台的引用类使用指南(3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Java 2 平台引入了 java.lang.ref 包,其中包括的类可以让您引用对象,而不将它们留在内存中。这些类还提供了与垃圾收集器(garbage collector)之间有限的交互。

作者:Peter Haggar 来源:ChinaITLab  2007年9月3日

关键字:

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

obj = null;System.gc();

//run the collector

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

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



现在,调用 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()); }}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章