Welcome

首页 / 软件开发 / JAVA / java的强引用、软引用、弱引用及虚引用

java的强引用、软引用、弱引用及虚引用2016-08-20a910626

一.这个知识出现的目的是什么

解决内存泄露和OOM的问题

解合理的使用引用可以帮助垃圾回收器更好的管理Java内存

二.这个知识的应用场合是什么

在可能造成内存泄露的场景下

oom

因为软引用、弱引用、虚引用,不会和它关联的对象造成引用,所以不会对和他们关联的对象的生命周期产生影响。

特别注意,在世纪程序设计中一般很少使用弱引用与虚引用,使用软用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。

三.这个知识的基本概念

1.强引用(StrongReference)

解强引用是我们在编程过程中使用的最简单的引用,如代码String s=”abc”中变量s就是字符串对象”abc”的一个强引用。任何被强引用指向的对象都不能被垃圾回收器回收,这些对象都是在程序中需要的。

2.软引用(SoftReference)

解软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

解软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被JVM回收,这个软引用就会被加入到与之关联的引用队列中。

3.弱引用(WeakReference)

解弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。

4.虚引用(PhantomReference)

解虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

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

四.一个demo

Demo2 { (String[] args) {String hello =String();SoftReference sr =SoftReference(hello);hello = ;System..println(sr.());String hello1 =String();WeakReference<String> sr1 =WeakReference<String>(hello1);hello1 = ;System..println(sr1.());System.gc();System..println(sr1.());ReferenceQueue<String> queue =ReferenceQueue<>();String hello2 =String();PhantomReference<String> pr =PhantomReference<>(hello2, queue);hello2 = ;System..println(pr.());}}

五.一个应用场景

解下面举个例子,假如有一个应用需要读取大量的本地图片,如果每次读取图片都从硬盘读取,则会严重影响性能,但是如果全部加载到内存当中,又有可能造成内存溢出,此时使用软引用可以解决这个问题。

解设计思路是:用一个HashMap来保存图片的路径 和 相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题。在Android开发中对于大量图片下载会经常用到。

下面这段代码是摘自博客:

http://blog.csdn.net/arui319/article/details/8489451

..... Map<String, SoftReference<Bitmap>> imageCache =HashMap<String, SoftReference<Bitmap>>();<br>....(String path) {Bitmap bitmap = BitmapFactory.decodeFile(path);SoftReference<Bitmap> softBitmap =SoftReference<Bitmap>(bitmap);imageCache.put(path, softBitmap);}Bitmap (String path) {SoftReference<Bitmap> softBitmap = imageCache.(path); (softBitmap == ) { ;}Bitmap bitmap = softBitmap.(); bitmap;}