- 强引用
- 软引用(SoftReference)
- 弱引用(WeakReference)
- 虚引用(PhantomReference)
强引用
当内存不足时,jvm宁可抛出OutOfMemory错误,也不会回收内存
/**
* 强引用
*/
public void fun1() {
// Object object = new Object();
// Object[] objArr = new Object[1000];
Object object = new Object();//强引用
Object ref = object;//引用传递
System.out.println(object);
boolean equals = object.equals(new Object()); //可直接通过obj取得对应的对象
System.out.println(equals);
object = null;//断开引用与对象的链接
System.gc();
System.out.println(object);
System.out.println(ref);
}
软引用
GC的时候,一旦发现软引用的对象,如果此时jvm内存足够,则不会回收该对象,反之,回收。
/**
* 软引用
*/
public void fun2(){
Object object = new Object();
SoftReference<Object> reference = new SoftReference<Object>(object);
object = null;
System.out.println(reference.get());
System.gc();//对比弱引用
System.out.println(reference.get());//非Null
}
弱引用
GC的时候,一旦发现弱引用,无论当前内存是否足够,都会回收该对象。
/**
* 弱引用
*/
public void fun3(){
Object object = new Object();
WeakReference<Object> reference = new WeakReference<Object>(object);
object = null;
System.out.println(reference.get());//结果:java.lang.Object@610455d6
System.gc();
System.out.println(reference.get());//结果:null
}
虚引用
虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
/**
* 虚引用
*/
public void fun4(){
ReferenceQueue<String> queue = new ReferenceQueue<>();
String string = new String("hello");
PhantomReference<String> reference = new PhantomReference<String>(string,queue);
System.out.println(reference.get());//结果 null
}
引用强度排序
强应用>软引用>弱引用>虚引用
网友评论