强引用:普通new对象的引用
User user = new User();
jvm宁愿抛出OutOfMemory异常也不会去回收该对象
软引用:
SoftReference引用的装饰的对象,该对象的强引用应该赋值空
这里配合ReferenceQueue使用(也可以不配合),因为SoftReference本身也是new了一个对象
当他把别人的问题解决掉以后,也需要把自己的问题解决,所以当jvm把软引用
对象回收后,就会把自己的对象引用放到这个队列中,我们可以通过队列的poll()
方法查看,如果存在该ReferenceQueue,那么就说明该对象的软引用对象已经被jvm
回收,我们需要将该ReferenceQueue引用也赋值为空,等待被jvm回收。
注意:软引用对象是在jvm内存不够的时候才会被回收,我们调用System.gc()方法只是
起通知作用,jvm什么时候扫描回收对象是,是jvm自己的状态决定的。就算扫描到软引用
对象也不一定会回收它。只有内存不够的时候才会回收
ReferenceQueue queue = new ReferenceQueue();
User user = new User();
SoftReference ref=new SoftReference(user, queue);
user=null;
弱引用:弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,只要扫描到,
无论内存是否充足(与软引用的区别),都会回收被弱引用关联的对象。在java中,
用java.lang.ref.WeakReference类来表示
WeakReference sr = new WeakReference(new User());
System.out.println(sr.get());
System.gc(); //通知JVM的gc进行垃圾回收,但是之前使用的时候调用这个,下边输出不为null,暂时原因未明
System.out.println(sr.get());
虚引用:
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。
在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,
则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,
如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。
程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。
如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
ReferenceQueue queue = new ReferenceQueue();
PhantomReference pr = new PhantomReference(new User(), queue);
System.out.println(pr.get());//但是之前使用的时候调用这个,下边直接报错,暂时原因未明