一、 强引用(StrongReference)
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。
Object strongReference = new Object();
只有把它设置为NULL的时候,垃圾回收机制才会进行回收。
二、 软引用(SoftReference)
如果一个对象具有软引用,如果内存充足,软引用对象不会被回收。那么当内存不足的时候,就会回收软引用对象。如果软引用回收了之后,仍然没有足够的内存空间,那么就抛出异常。
设置堆最大为20M
package DEMO;
import java.lang.ref.SoftReference;
public class SoftReferenceDemo {
public static void main(String[] args) {
SoftReference<byte []> m=new SoftReference<>(new byte[1024*1024*10]);//10M,内存中开辟了一个10M的空间
//m=null
System.out.println(m.get());
//进行垃圾回收
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(m.get());
//加入顶的大小是20M,已经设置了一个m为10M的空间,现在新增一个B为12M的空间,堆内超量了。
//如果是软引用,会自动回收m对象。
byte [] b=new byte[1024*1024*12];
System.out.println(m.get());
}
}
注意,软引用,如果新增的B的大小即使回收了M还是超出范围的话,就会报错,因此B的大小得设置的不太大。
三、 弱引用(WeakReference)
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
package DEMO;
import java.lang.ref.WeakReference;
public class WeakReferenceDemo {
public static void main(String[] args) {
WeakReference<byte []> m=new WeakReference<>(new byte[1024*1024*10]);//10M,内存中开辟了一个10M的空间
System.out.println(m.get());
System.gc();
System.out.println(m.get());
}
}
弱引用一遇到GC就被干死了,无论内存多少。
四、 虚引用(PhantomReference)
虚引用顾名思义,就是形同虚设。与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。