Java强引用、软引用、弱引用和虚引用

看了一篇关于Java中如何防止OOM的文章,里边提到了Java的软引用和弱引用的作用,正好这段时间一直在关注Android 的ANR问题,所以这部分Java基础知识还得强化一下。

一,四个引用的概念:
1、强引用(StrongReference):Java强引用就是声明对象时JVM生成的引用,在强引用环境下,GC时是不会回收这种类型的引用,即使在OOM发生的时候,也不会回收这类型的对象;
回收:中断了强引用和某个对象之间的关联,在JVM发生GC的时候,JVM在合适的时间就会回收该对象,可以设置强引用为NULL。

2、软引用(SoftReference):即:java.lang.ref.SoftReference类来表示,一般用来当做缓存使用,描述一些有用但并不是必需的对象。
回收:软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。
SoftReference srTemp = new SoftReference(new String(“helloWorld!”));

3.弱引用(WeakReference):弱引用即:java.lang.ref.WeakReference类来表示,与软引用类似,都是作为缓存来使用。
回收:与软引用不同,弱引用在进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。
WeakReference srTemp = new WeakReference(new String(“helloWorld”));

4.虚引用(PhantomReference):虚引用即java.lang.ref.PhantomReference类表示,虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期,所以可以理解虚引用已经是无法回收的引用。
要注意的是,虚引用必须和引用队列关联使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会把这个虚引用加入到与之 关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

你可能感兴趣的:(Java基础知识)