java中的四种引用

1.五种引用:

强引用,软引用,弱引用,虚引用,终结器引用

1.1.强引用(StrongReference):

我们平时见到的所有引用都是强引用(创建一个对象,变量名对对象的引用称为强引用),

只要沿着GC Root的引用链可以找到就不会被垃圾回收,当没有任何的根对象直接或间接引用它,它就会被垃圾回收

 String ste=new String("abc");//强引用

1.2.软引用(SoftReference):

使用目的:软引用用来描述一些有用但非必须的对象。软引用可以用来实现内存敏感的高速缓存。

对象只有软引用,没有被直接的强引用引用,则有可能被垃圾回收

垃圾回收后内存不够时,且没有强引用引用它,就会回收它;可以配合引用队列来释放软引用本身。

SoftReference<String> softReference = new SoftReference<String>(new String("abc"));//软引用

1.3.弱引用(WeakReference):

只要没有强引用引用它,只要发生垃圾回收, 就会回收它,无论内存够不够;可以配合引用队列来释放弱引用本身。

WeakReference weak = new WeakReference(new String("abc"));//弱引用

1.4.虚引用(PhantomReference):

虚引用并不会决定对象的生命周期,若一个对象仅持有虚引用,那它和没有任何引用一样,任何时候都有可能会被垃圾回收器回收,也无法通过虚引用来获得一个实例对象。

必须配合引用队列使用,主要配合ByteBuffer使用,引用对象回收时,会将虚引用入引用队列,由线程调用虚引用中的相关方法释放直接内存。

 ReferenceQueue rq = new ReferenceQueue();//引用队列
 PhantomReference pr = new PhantomReference(str,rq);//虚引用

1.5.终结器引用:

无需手动编码,其内部配合引用队列使用,垃圾回收时终结器引用入队列(被引用对象暂时没有被回收),再由finalize线程通过终结器引用找到被引用对象并调用它的finalize()方法,第二次GC时,才能回收它被引用的对象。

详解终结器引用的使用:finallize()是Object类中的一个终结方法,释放资源时使用,当一个对象重写了finallize()方法,并且没有强引用引用这个对象时,这个对象就可以被垃圾回收了,它的回收和终结器引用有关,java虚拟机会自动创建一个终结器引用引用它,当没有强引用引用此对象时,终结器引用入引用队列,此时引用对象并没有被回收,再由finalize线程通过终结器引用找到被引用对象并调用它的finalize()方法,第二次GC时,才能回收此对象。由此可见finallize的工作效率很低,首先需要其对象相关的终结器引用入队列,而处理引用队列的线程的优先级很低,被执行的次数很少,有可能导致对象所占用的内存迟迟不能被释放,不推荐使用此方法释放资源。

posted on 2021-06-02 18:10  凡人精灵  阅读(168)  评论(0编辑  收藏  举报

导航