[Java]引用

什么是引用

在Java代码中,是通过引用来访问对象数据的,比如:
Object obj = new Object();
其中的obj就是一个引用,而通过应用访问真实数据的常见方法有两种:

另一种方法:


引用的类型

引用的不同类型决定了他们面对GC的不同表现。我们通常用到是强引用,如果有强引用指向某个对象,那么这个对象就不会被GC回收掉(这句话是有漏洞的,但是一时不知道怎么说才好)。而弱引用(WeakReference)则不同,如果只剩下弱引用,那么在下次GC的时候就会被回收掉,举个例子:
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

public class Main {

    public static void main(String[] args) throws Exception {
        Object referene = new Object();
        ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
        WeakReference<Object> ref = new WeakReference<Object>(referene, queue)
                ;
        referene = null;
        System.out.println(ref.get());// java.lang.Object@6bbc4459
        System.out.println(ref.isEnqueued());// false
        System.gc();
        System.out.println(ref.isEnqueued());// true
        System.out.println(ref.get());// null
    }
}
在运行的时候加上参数:
-verbose:gc

输出的结果如下:

java.lang.Object@3a3ee284
false
[GC 1262K->320K(120576K), 0.0006371 secs]
[Full GC 320K->197K(120576K), 0.0045087 secs]
true
null

弱引用的用法在ThreadLocal里面就看的比较明白了,想类似的情况中如果不用弱引用的话可能导致内存泄露,进而OOM。


SoftReference和WeakReference有点像:GC都不会因为他们而放过对象,但是区别在于,软引用只有在内存吃紧的时候才会被回收掉。这样是的软引用适合做本地缓存,因为既不会导致OOM,也能使得对象存活的尽量的久。


而PhantomReference则又不相同,有没有他没什么区别,并不会影响GC会不会回收对象,不过他有一个作用是能看到对象是什么时候被回收掉的。

----------END----------

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值