String str2 = new String("hello");
ReferenceQueue rQueue = new ReferenceQueue();
java.lang.ref.WeakReference wf = new java.lang.ref.WeakReference(str2, rQueue);
java用这样的方式创32313133353236313431303231363533e78988e69d8331333365653237建弱引用,一般和引用队列一起使用,这样当这个引用对象被垃圾回收器打描标记为垃圾的时候,它会自动加入引用队列,方便你自己在合适的时候清理。这个代码其实"hello"对象同时具备强引用和弱引用,后面引用队列的处理就不多说了,有兴趣的可以去网上找一下相关内容。
弱引用即使和一个变量关联,也有可能被回收掉。那么弱引用用在什么场合呢?
一般是占用大量内容的对象,而且被回收后又能很快创建。比如一个用户资产管理的软件,关联到用户信息(很多数据)的引用可以置为弱引用,这样当用户长时间不触发应用时,清理掉这块内存用在其它地方。再比如jdk里的WeakHashMap。还有一种情况,比如你想写一个 Java 程序,观察某对象什么时候会被垃圾收集的执行绪清除,你必须要用一个 reference记住此对象,以便随时观察,但是却因此造成此对象的 reference 数目一直无法为零,使得对象无法被清除。这种时候可以用弱引用,像下面这样:
[java] view plain copy
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());
}
...