Java对象引用类型

    在Java中,有一个话题方向是内存管理和回收。因为jvm把这些回收的操作和策略都实现了。并且一直在改进。所以,一般在开发过程中对内存回收相关事情我们是无感知的。其实这也是java能够很快超越C和C++的原因之一吧。在Java中,为了配合内存回收,提供了四种引用类型。分别是:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)、虚引用(PhantomReference)

这四种引用分别对应四种四种回收机制和策略。

接下来,分别讨论。

  • 强引用(StrongReference)

    在日常的开发中,基本使用的都是强引用,最常见的new一个对象,就属于强引用。并且开发人员最熟悉的就是强引用,不多在这里讨论。

//这里的object引用便是一个强引用,不会被GC回收。
Object object = new Object();
  • 软引用(SoftReference)

 特点:

    软引用(SoftReference)的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用。另外,一旦垃圾线程回收该Java对象之 后,get()方法将返回null。软引用的对象容易操控,不会强制驻守在内存,是缓存的极佳方式。    

    软引用在JVM报告内存不足的时候才会被GC回收,否则不会回收

  使用示例:

Map<String, SoftReference<Bitmap>> imageCache = new new HashMap<String, SoftReference<Bitmap>>();
//强引用的Bitmap对象
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//软引用的Bitmap对象
SoftReference<Bitmap> bitmapcache = new SoftReference<Bitmap>(bitmap);
//添加该对象到Map中使其缓存
imageCache.put("1",softRbitmap);
..
.
//从缓存中取软引用的Bitmap对象
SoftReference<Bitmap> bitmapCache = imageCache.get("1");
//取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空
Bitmap bm = bitmapCache .get();
  • 弱引用(WeakReference)

特点:

    和软引用相比,被弱引用了的对象拥有更短的内存时间(也就是生命周期)。垃圾回收器一旦发现了被弱引用的对象,不管当前内存空间是不是足够,都会回收它的内存

    当GC一但发现了弱引用对象,将会释放WeakReference所引用的对象。弱引用使用方法与软引用类似,但回收策略不同。                    

  • 虚引用(PhantomReference)

特点:    

    虚引用不是一种真实可用的引用类型,完全可以视为一种“形同虚设”的引用类型。设计虚引用的目的在于结合引用关联队列,实现对对象引用关系的跟踪。虚引用对应着java.lang.ref.PhantomReference类。一个对象如果要被虚引用,只需将其作为参数传入PhantomReference类的构造方法中就行了,同时作为参数传入的还有引用关联队列java.lang.ref.ReferenceQueue的对象实例。

 

 

 

转载于:https://my.oschina.net/ChinaHaoYuFei/blog/3059247

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值