了解软、弱、虚、强 引用的目的
1.了解对象的生命周期
2.合理的使用对象的生命周期,使得JVM能够合理的回收,避免OOM异常
强引用的回收条件:
1.脱离作用域(对象声明在方法内部,当方法执行完毕)
2.强引用对象设置成null
static Object object=new Object();
public static void main(String[] args) {
Object ob=object;
object=null;
System.gc();
System.out.println("gc之后:"+ob);
}
static Object object=new Object();
public static void main(String[] args) {
Object ob=object;
ob=null;
object=null;
System.gc();
System.out.println("gc之后:"+ob);
}
回收机制:当强引用存在,即使JVM发生OOM也不会回收对象
软引用:SoftReference
只有在发生OOM之前,软引用才会被回收
软引用和强引用在内存充足的情况下都不会被回收,只有在内存不足的情况下,软引用才会被回收避免OOM
弱引用:WeakReference 当对象未使用,只有在GC之后,才会被回收
public static void main(String[] args) {
Object obj=new Object();
WeakReference<Object> weakReference=new WeakReference<Object>(obj);
obj=null;
System.gc();
System.out.println("gc之后:"+weakReference.get());
}
特例:String
public static void main(String[] args) {
String str="Mic";
WeakReference<Object> weakReference=new WeakReference<Object>(str);
str=null;
System.gc();
System.out.println("gc之后:"+weakReference.get());
}
String存储在常量池 但是GC不会回收常量池
回收机制:
1.引用被设置成null
2.有GC执行
虚引用(PhantomReference)
public static void main(String[] args) {
ReferenceQueue queue=new ReferenceQueue();
Object phantomObject=new Object();
PhantomReference phantomReference=new PhantomReference(phantomObject,queue);;
phantomObject=null;
System.gc();
System.out.println("gc之后:"+phantomReference.get());
System.out.println(queue.poll());
}
回收机制:
1.当引用对象变为null 触发GC
2.JVM会将对象放入queue
使用场景:
当对象被回收,通过队列就可以操作将要被回收的对象