在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> imageCache = new new HashMap >();//强引用的Bitmap对象Bitmap bitmap = BitmapFactory.decodeStream(inputStream);//软引用的Bitmap对象SoftReference bitmapcache = new SoftReference (bitmap);//添加该对象到Map中使其缓存imageCache.put("1",softRbitmap);...//从缓存中取软引用的Bitmap对象SoftReference bitmapCache = imageCache.get("1");//取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空Bitmap bm = bitmapCache .get();
- 弱引用(WeakReference)
特点:
和软引用相比,被弱引用了的对象拥有更短的内存时间(也就是生命周期)。垃圾回收器一旦发现了被弱引用的对象,不管当前内存空间是不是足够,都会回收它的内存
当GC一但发现了弱引用对象,将会释放WeakReference所引用的对象。弱引用使用方法与软引用类似,但回收策略不同。
- 虚引用(PhantomReference)
特点:
虚引用不是一种真实可用的引用类型,完全可以视为一种“形同虚设”的引用类型。设计虚引用的目的在于结合引用关联队列,实现对对象引用关系的跟踪。虚引用对应着java.lang.ref.PhantomReference类。一个对象如果要被虚引用,只需将其作为参数传入PhantomReference类的构造方法中就行了,同时作为参数传入的还有引用关联队列java.lang.ref.ReferenceQueue的对象实例。