Java中的4种对象引用类型:强引用、软引用、弱引用和虚引用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/reakingf/article/details/51428708

Java语言为程序员提供了4个不同级别对象引用类型,按照级别从高到低分别为:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PlantomReference)。在这四种引用类型中,只有强引用类型是包内可见的,其他三种的可见性都为public,且在使用时均是显示使用,如SoftReference sf = new SoftReference(Object)


强引用 StrongReference

强引用是我们最常见到的对象引用类型,如String s = new String()便是一个强引用。强引用的主要特点如下:

1.  可以直接访问目标对象;

2.  所指向的对象在任何时候都不会被回收。JVM宁可抛出OOM(out of memory)异常也不会回收强引用所指向的对象,即GC(垃圾回收或垃圾收集)绝对不会回收强引用类型;

3.  由于GC绝不会回收强引用,所以它将可能导致内存泄漏。


软引用 SoftReference

软引用用于描述一些还有用但并非必须的对象,一般用于实现一些内存敏感的缓存,当系统内存充足时,这部分缓存可用于加速系统的运行,提高系统速度,但当系统内存紧张时,系统便会回收这部分内存,被回收的这些软引用会被加入与它们相关联的引用队列(ReferenceQueue)中。在Android中,对于经常要用到的图片,一般建议使用软引用进行缓存,这样可以大大提高图片的读取速度(不做缓存则需要每次都做文件读取,而文件读取的速度相对于直接从内存中读取时非常慢的),而由于图片一般较大,占用内存较多,所以很容易产生OOM(内存溢出),这时GC便可以直接回收这一部分的软引用对象,释放这些图片缓存所占用的内存。


弱引用 WeakReference

弱引用用于实现一些规范化映射(WeakHashMap),其中key或者value当它们不再被引用时可以自动被回收。当你想引用一个对象,但是这个对象有自己的生命周期,你又不想介入这个对象的生命周期时,便可以用弱引用。同时弱引用也可以用来保存那些可有可无的缓存数据,和软引用一样,在内存充足时加速系统,在内存不足时便被系统回收。弱引用在系统GC时,只要一被发现,不管系统堆内存空间是否足够,都会将对象进行回收,一旦被回收便会被加入到相关联的引用队列中。但是,由于垃圾回收器的线程通常优先级很低,所以并不一定能很快发现持有弱引用的对象,所以弱引用的生命周期是从被创建到下一次GC发送之前。


虚引用 PlantomReference

虚引用又叫幽灵或幻影引用,主要用来跟踪对象被垃圾回收器回收清理的活动,提供比Java清理机制更灵活的处理方式。虚引用是所有引用类型中最弱的一个,如果一个对象拥有一个虚引用,那它便和没有被引用一样,随时可能被GC回收,而且GC在回收时会直接销毁持有该引用的对象,并把虚引用加入引用队列中。除此之外需要注意的一点是,当虚引用试图通过get()方法取得强引用时,无论强引用是否存在,总是会失败,即获得的返回值永远为null。

虚引用与软引用和弱引用的区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

 

猜你喜欢

转载自blog.csdn.net/reakingf/article/details/51428708