1.强引用
package com.cap3;
public class Test1 {
static Object strongRefence=new Object();
public static void main(String[] args) {
Object object=strongRefence;
strongRefence=null;
System.gc();
System.out.println("After gc->"+object);
}
}
//打印结果
After gc->java.lang.Object@140e19d
强引用会被回收的情况:
脱离作用域
2.软引用
package com.cap3;
import java.lang.ref.SoftReference;
public class Test1 {
public static void main(String[] args) {
Object object=new Object();
//发生OOM异常前会被回收
SoftReference<Object> softReference=new SoftReference<Object>(object);
System.out.println(softReference.get());
}
}
软引用会被回收的情况:
软引用在内存充足的情况下不会被回收,在内存不足的情况下,软引用才会被回收,避免发生OOM
3.弱引用
package com.cap3;
import java.lang.ref.WeakReference;
public class Test1 {
public static void main(String[] args) {
Object object=new Object();
WeakReference<Object> weakReference=new WeakReference<Object>(object);
object=null;
System.gc();
System.out.println("After Gc->"+weakReference.get());
}
}
软引用会被回收的情况:
是个Gc就把他灭了
4.虚引用
package com.cap3;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class Test1 {
public static void main(String[] args) throws InterruptedException {
//引用队列
ReferenceQueue referenceQueue=new ReferenceQueue();
Object phantomObj=new Object();
PhantomReference phantomReference=new PhantomReference(phantomObj,referenceQueue);
phantomObj=null;
System.gc();
//System.out.println(phantomReference.get());
//虚引用要通过引用队列去取值
Thread.sleep(500);
System.out.println(referenceQueue.poll());
}
}
虚引用主要用来追踪对象