java之弱引用

转载请注明出处

http://blog.csdn.net/pony_maggie/article/details/46508565


作者:小马


大部分情况下我们看到是强引用,比如下面这一行:

String str1 = new String("abc");


变量str1被用来存放一个string对象的强引用上。强引用在你正在使用时这个对象时,是不会被垃圾回收器回收的,这在大部分情况下是对的。当出现内存空间不足时,虚拟机不会释放强引用的对象占用的空间,而是选择抛出异常。当然不可能是永远不清理,比如当你把str1 = null时,垃圾回收器还是会处理。只是作为一种GC的语言,我们不必关心一个对象是什么时候被回收的。


再看这段代码:

String str2 = new String("hello");
ReferenceQueue<String> rQueue = new ReferenceQueue<String>();
java.lang.ref.WeakReference<String> wf = new java.lang.ref.WeakReference<String>(str2, rQueue);

java用这样的方式创建弱引用, 一般和引用队列一起使用,这样当这个引用对象被垃圾回收器打描标记为垃圾的时候,它会自动加入引用队列,方便你自己在合适的时候清理。这个代码其实"hello"对象同时具备强引用和弱引用,后面引用队列的处理就不多说了,有兴趣的可以去网上找一下相关内容。

弱引用即使和一个变量关联,也有可能被回收掉。那么弱引用用在什么场合呢?

一般是占用大量内容的对象,而且被回收后又能很快创建。比如一个用户资产管理的软件,关联到用户信息(很多数据)的引用可以置为弱引用,这样当用户长时间不触发应用时,清理掉这块内存用在其它地方。再比如jdk里的WeakHashMap。还有一种情况,比如你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零,使得对象无法被清除。这种时候可以用弱引用,像下面这样:

A obj = new A();
    WeakReference wr = new WeakReference(obj);
    obj = null;

    //等待一段时间,obj对象就会被垃圾回收
...

if (wr.get()==null) {
System.out.println("obj 已经被清除了 ");
} else {
System.out.println("obj 尚未被清除,其信息是 " obj.toString());
}
...


你可能感兴趣的:(java之弱引用)