强引用
就是正常的对象定义及引用,分配
Object object=new Object();
软引用
软引用呢,内存空间足够就不回收,不够就回收
public static void soft() throws Exception{
Object obj = new Object();
ReferenceQueue rq = new ReferenceQueue<>();
SoftReference sr = new SoftReference(obj, rq); //创建关于obj的软引用,使用引用队列
System.out.println(sr.get()); //get方法会输出这个obj对象的hashcode
System.out.println(rq.poll()); //输出为null
obj = null;
System.gc();
Thread.sleep(200); //因为finalizer线程优先级很低,所以让线程等待200ms
System.out.println(sr.get()); //因为堆空间没满,可有可无的特性,所以还是会输出这个obj对象的hashcode
System.out.println(rq.poll()); //自然队列为null
弱引用
弱引用呢,就是内存够不够,都要被回收,只要GC就回收
虚引用
虚引用必须和引用队列一起使用
就是幽灵引用,当回收的时候,会先标记,把虚引用加入到引用队列中。真正回收的时候会看是否需要回收,判断标准断是:队列中是否加入虚引用来判断被引用的对象是否将要GC回收,从而可以在finalize方法中采取措施。