浅谈java中的引用

jvm1.2以前关于引用的最原始的定义是:如果reference类型中存储的数据代表另一块内存的起始地址,就称这块内存代表一个引用。

    (这种定义有一个致命的缺陷是:引用只有两种状态  1.被引用;2.没有被引用)

    为什么说只有两种状态就是一个致命的缺陷呢?

        因为对于好多对象,我们在回收的事情上需要加判断(也许对象正在被应用,在有的情况下也需要回收;也许对象没有被引用,也不应该回收掉) ,例如缓存对象,引用存在,但是在内存不足的条件下,照样需要回收这类对象。


JDK1.2  之后,对引用进行了扩充,大致分为以下四种:

    1.强引用:只要这类引用存在,永远不会被回收。

    2.软引用:在内存溢出之前,对这类对象进行回收。如果回收之后,内存还是不够,再抛出内存溢出。

    3.弱引用:被这类引用指向的对象,只能生存到下次GC前,下次GC的时候,无论内存大小,这个对象都会被回收。

    4.虚引用: 和会不会被GC没有任何关系,也无法通过一个虚引用的到对象的实例。这类引用的目的是对象在被GC时,虚拟机收到一个通知。


从上面这四种引用的生命范围,可以看出,如果能有效的利用这四种引用,能有效的优化系统OOM异常。

1、产生强引用:系统中最长用的一种引用。例如:User user = new User();  克隆,反序列化。

2、产生软引用:SoftReference<User> sr = new SoftReference<User>(new User());   这个包是java.lang.ref

3、产生弱引用:WeakReference<User> sr = new WeakReference<User>(new User());

4、提供了一个PhantomReference类,但是没有想明白为什么要产生虚引用的对象?难道是为了产生垃圾来回收?

5.   无引用:User user = new    User();  user = null;   


    个人理解:一个对象在系统中,引用的类型并不会自己发生改变。  不是第一次被标记,对象就会由强引用变成软引用或者其他引用。判断一个对象是否被回收,就是看此对象是什么引用,然后根据引用的生命周期去判断回收时间。

*如果没有user=null; 也就是对象还是存在强引用,或者是只要user没有超出作用范围,即使调用了finalize()对象也不会被回收的。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值