84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
在<<深入理解Java虚拟机>>3.2.3中有这么一句话
“为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。”
请问利用虚引用在对象被回收时收到一个系统通知要怎么实现呢?能提供下示例代码吗?
业精于勤,荒于嬉;行成于思,毁于随。
在这里看到了PhantomReference的用法:
import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.reflect.Field; public class Test { public static boolean isRun = true; @SuppressWarnings("static-access") public static void main(String[] args) throws Exception { String abc = new String("abc"); System.out.println(abc.getClass() + "@" + abc.hashCode()); final ReferenceQueue<String> referenceQueue = new ReferenceQueue<String>(); new Thread() { public void run() { while (isRun) { Object obj = referenceQueue.poll(); if (obj != null) { try { Field rereferent = Reference.class .getDeclaredField("referent"); rereferent.setAccessible(true); Object result = rereferent.get(obj); System.out.println("gc will collect:" + result.getClass() + "@" + result.hashCode() + "\t" + (String) result); } catch (Exception e) { e.printStackTrace(); } } } } }.start(); PhantomReference<String> abcWeakRef = new PhantomReference<String>(abc, referenceQueue); abc = null; Thread.currentThread().sleep(3000); System.gc(); Thread.currentThread().sleep(3000); isRun = false; } }
原来要和ReferenceQueue搭配使用。
在这里看到了PhantomReference的用法:
原来要和ReferenceQueue搭配使用。