1.强应用
不会轻易被GC回收,除非不在任一一个以GC Root为起点的引用链中.
Object obj=new Object();
2.软引用
只有在内存不足的时候,软引用才会被回收.
public static void testSoftReference(){
User user=new User("Owen",18);
SoftReference<User> reference=new SoftReference<>(user);
user=null;
System.out.println("user为null,软引用依旧不会被回收 :"+reference.get());
System.gc();
System.out.println("GC之后,如果内存够用,软引用还是不会被回收:"+reference.get());
//向堆中填充数据,导致OOM
List<byte[]> list=new LinkedList<>();
try{
for(int i=0;i<100;i++){
System.out.println("for==========:"+reference.get());
list.add(new byte[1024*1024*1024*1]);
}
}catch (Exception e){
System.out.println("Exception:"+reference.get());
}
}
3.弱引用
在GC回收的时候,弱引用会被回收
public static void testWeakReference(){
User user=new User("Owen",18);
WeakReference<User> reference=new WeakReference<>(user);
user=null;
System.out.println("user为null,弱引用依旧不会被回收 :"+reference.get());
System.gc();
System.out.println("GC之后,弱引用被GC回收:"+reference.get());
}
4.虚引用
用于监听GC回收,判断给引用是否被垃圾回收。
当引用被垃圾回收时,该引用的对象被添加到ReferenceQueue中,如果引用队列队头元素不为null,表示应用已经被GC回收了。
public static void testPhantomReference() {
try {
//虚引用:功能,不会影响到对象的生命周期的,
// 但是能让程序员知道该对象什么时候被 回收了
ReferenceQueue<Object> referenceQueuee=new ReferenceQueue<Object>();
Object phantomObject=new Object();
//虚引用需要配合引用队列才能看到效果
PhantomReference phantomReference =new
PhantomReference(phantomObject,referenceQueuee);
phantomObject=null;//方便进行垃圾回收
System.out.println("phantomObject:"+phantomReference.get());//输出null
System.out.println("phantomReference:"+referenceQueuee.poll());//输出null
System.gc();//phantomObject被回收之后,会被加入到引用队列中
Thread.sleep(2000);
//从引用队列的队头获取元素
System.out.println("referenceQueue:"+referenceQueuee.poll() );//输出GC回收的对象
}catch (Exception e){
System.out.println("exception:"+e.toString());
}
}
网友评论