java的四种引用的理解

弱引用, WeakReference当一个对象只用弱引用的时候, 收集器发现它了就会回收它, 没发现就是还可以使用的

软引用, SoftReference 当内存不足的时候, 在进行fullGC之前会回收软引用, 所以使用用来作为缓存

虚引用 PhantomReference 这个引用丝毫不会影响它的回收,虚引用主要用来跟踪对象被垃圾回收器回收的活动

finalize的方法的调用过程,

  • 当Minor GC 回收时候, 如对象没有实现finalize方法, 就直接回收, 如果实现了, 就会把这个对象放入到finalize Quenu中. Minor GC线程不会执行finalize方法的
  • MinorGC结束, 主线程运行, finalize 执行线程也开始挨个执行finalize方法.
  • 下次执行MinorGC的时候, 发现这个对象的finalize已经执行完了, 就会直接回收

finalize的方法会存在与两次的回收过程中, 所以不推荐使用这个方法, 还有finalize方法永远只是执行一次,

虚引用: 当对象被销毁后会把他的引用放入一个引用队列中, 系统可以监控这个队列, 从而来监控那些对象的销毁

引用队列(ReferenceQueue)
效果:引用队列可以配合软引用、弱引用及幽灵引用使用,当引用的对象将要被JVM回收时,会将其加入到引用队列中。

应用:通过引用队列可以了解JVM垃圾回收情况。

// 引用队列
ReferenceQueue<String> rq = new ReferenceQueue<String>();

// 软引用
SoftReference<String> sr = new SoftReference<String>(new String("Soft"),rq);
// 弱引用
WeakReference<String> wr = new WeakReference<String>(new String("Weak"),rq);
// 幽灵引用
PhantomReference<String> pr = new PhantomReference<String>(new String("Phantom"),rq);

// 从引用队列中弹出一个对象引用
Reference<? extends String> ref = rq.poll();

ReferenceQueue和Reference

  1. ReferenceQueue含义及作用

通常我们将其ReferenceQueue翻译为引用队列,换言之就是存放引用的队列,保存的是Reference对象。其作用在于Reference对象所引用的对象被GC回收时,该Reference对象将会被加入引用队列中(ReferenceQueue)的队列末尾。

ReferenceQueue常用的方法:
public Reference poll():从队列中取出一个元素,队列为空则返回null;
public Reference remove():从队列中出对一个元素,若没有则阻塞至有可出队元素;
public Reference remove(long timeout):从队列中出对一个元素,若没有则阻塞至有可出对元素或阻塞至超过timeout毫秒;

见如下代码:

ReferenceQueue< Person> rq=new ReferenceQueue();
Person person=new Person();
SoftReference sr=new SoftReference(person,rq);

这段代码中,对于Person对象有两种引用类型,一是person的强引用,而是sr的软引用。sr强引用了SoftReference对象,该对象软引用了Person对象。当person被回收时,sr所强引用的对象将会被放到rq的队列末尾。利用ReferenceQueue可以清除失去了软引用对象的SoftReference,如下操作:

SoftReference ref=null;
while((ref=(Person)rq.poll())!=null){
    
}

猜你喜欢

转载自blog.csdn.net/leisurelen/article/details/89138112