1 public classReferenceTest {2 public static voidmain(String[] args) {3 //test1();//软引用4 //test2();//弱引用5 //test3();//幽灵引用_1
6 test4();//幽灵引用_2
7
8 }9 public static voidtest1(){10 //在堆中创建一个对象Obj11 //在栈中创建一个p来强引用此对象Obj
12 Person p=new Person(1);13
14 //在栈中创建一个softReference来软引用此对象Obj 可以获取对象的属性值
15 SoftReference softReference=new SoftReference(p);16 System.out.println(p.getId());//输出打印:1
17 System.out.println(softReference.get().getId());//输出打印:118
19 //断开p和Obj的强引用
20 p=null;21 //System.out.println(p.getId());22 //System.gc();
23 System.out.println(softReference.get().getId());//输出打印:124 //并不报空指针异常 虽然断开了p和Obj的强引用,但是并没有被回收.25 //如果在前面调用gc() 垃圾回收 运行结果也是打印1的..软引用只有系统在发生内存溢出异常之前,会把只被软引用的对象进行回收
26 }27
28 public static voidtest2(){29 //在堆中创建一个对象Obj30 //在栈中创建一个p来强引用此对象Obj
31 Person p=new Person(1);32
33 //在栈中创建一个weakReference来弱引用此对象Obj 可以获取对象的属性值
34 WeakReference weakReference=new WeakReference(p);35 System.out.println(weakReference.get().getId());//打印输出:136
37 //断开p和Obj的强引用
38 p=null;39 //System.gc();
40 System.out.println(weakReference.get().getId());//打印输出:141 //p=null 之后 还是可以正常的打印输出1 说明断开强引用和其他弱引用,软引用压根没有关系.42 //如果在打印之前 调用gc() 方法之后 就会报错..java.lang.NullPointerException43 //垃圾回收不论内存是否不足都会回收只被弱引用关联的对象。
44
45 }46
47 public static voidtest3(){48 //在堆中创建一个对象Obj49 //在栈中创建一个p来强引用此对象Obj
50 Person p=new Person(1);51
52 //Phantom 幻影幽灵 的意思
53 ReferenceQueue referenceQueue = new ReferenceQueue();54 //在栈中创建一个phantomReference来虚引用此对象Obj 不可以获取对象的属性值
55 PhantomReference phantomReference=new PhantomReference(p,referenceQueue);56 System.out.println(phantomReference.get().getId());//打印报错 java.lang.NullPointerException57 //直接得不到p对象对应的id值....58 //PhantomReference的唯一作用就是 能在这个对象被收集器回收时收到一个系统通知 看test4()方法
59 }60
61 public static voidtest4(){62
63 //在堆中创建一个对象Obj64 //在栈中创建一个p来强引用此对象Obj
65 Person p=new Person(1);66
67 //Phantom 幻影幽灵 的意思
68 ReferenceQueue referenceQueue = new ReferenceQueue();69 //在栈中创建一个phantomReference来虚引用此对象Obj 不可以获取对象的属性值
70 PhantomReference phantomReference=new PhantomReference(p,referenceQueue);71
72 System.out.println(referenceQueue.poll());//打印输出: null 这个是查询队列中是否有元素.73
74 //断开p和obj的强引用
75 p=null;76 System.gc();//p被回收之后 队列referenceQueue中就有值了.
77
78 try{79 Thread.sleep(1000);80 } catch(InterruptedException e) {81 e.printStackTrace();82 }//过 一秒钟之后再查询队列中是否有元素.
83 System.out.println(referenceQueue.poll());//打印输出: java.lang.ref.PhantomReference@77fef1a084 //PhantomReference的唯一作用就是 能在这个对象被收集器回收时收到一个系统通知85 //如果这个对象被回收了,会把通知放到队列中.86
87 //如果前面p=null注释掉 再运行打印输出就是 null 因为p没有被回收(强引用中) 就不会把通知放到队列中...队列中为空 null88 //回收的标志就是把通知放到队列中..
89 }90 }91
92 classPerson{93 publicPerson(Integer id) {94 this.id =id;95 }96
97 privateInteger id;98
99 publicInteger getId() {100 returnid;101 }102
103 public voidsetId(Integer id) {104 this.id =id;105 }106
107 @Override108 protected void finalize() throwsThrowable {109 System.out.println("finalized!!!!!");110 }111 }