理解 java 强引用,软引用,弱引用,虚引用

1、强引用:只要某个对象有强引用与其关联,JVM一定不会回收这个对象。

A a = new A();

a = null;

A对象会被回收。但是有时我们不希望A对象立即被回收,可能在不久的将来还会用到(缓存)。这时候就需要软引用了

2、软引用:用来描述有用但非必需的对象,只有在内存不足时才会被JVM回收。适合缓存场景

A a = new A();

SoftReference softA = new SoftReference(a);

a = null;

此时A对象不会被立即回收,只有在内存不足时才会被回收。

3、弱引用:用来描述非必需对象的,当JVM进行垃圾回收时,会被立即回收。

A a = new A();

B b = new B(a);

a = null;

GC时,A对象不会被回收,因为还在被B引用。但此时A对象已经无用了,需要将其回收,否则就会造成内存泄漏。

使用弱引用

A a = new A();

WeakReference weakA = new WeakReference(a)

B b = new B(weakA);

a = null;

GC时,A对象会被立即回收。

4、虚引用:不影响对象的生命周期。在任何时候都可能被垃圾回收器回收。主要用于检测对象是否已经从内存中删除。

A a= new A();
PhantomReference  phA= new PhantomReference(obj);
a=null;
phA.get();//永远返回null

phA.isEnQueued();//返回是否从内存中已经删除

5、ReferenceQueue

一个引用队列,可以监控被回收的Reference对象,具体的就是当一个Reference引用对象所引用的值被回收了,那么JVM就会把这个Reference引用添加到这个队列里面。

软引用、弱引用中,会在对象被回收后Reference引用对象(SoftReference ,WeakReference )加入ReferenceQueue队列,通过观察ReferenceQueue,可得知对象在何时被回收了以及在对象被回收后做一些事(Weakhashmap)。

虚引用的构造方法中必须传入ReferenceQueue,在对象被回收前将PhantomReference对象加入ReferenceQueue中,通过观察ReferenceQueue,可以在对象被回收前做一些事。

参考:

https://www.cnblogs.com/yw-ah/p/5830458.html

https://blog.csdn.net/rodbate/article/details/72857447

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值