强引用:
直接new出来的对象就是强引用。 Object o = new Object(); 当设置o=null后,o才会等待gc回收。
软引用:
public void quote(){
SoftReference<byte[]> s = new SoftReference<>(new byte[1024*1024*10]);
System.out.println(s.get());//[B@5c8da962
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.gc();
System.out.println(s.get());//[B@5c8da962
byte[] b = new byte[1024*1024*10];
System.out.println(s.get());//NULL
}
其中 SoftReference就是软引用,在java虚拟机内存不足时,会被回收
弱引用
public void weakReferenceTest(){
WeakReference<byte[]> s = new WeakReference<>(new byte[1024*1024*10]);
System.out.println(s.get());//[B@5c8da962
System.gc();
System.out.println(s.get());//[NULL
}
WeakReference在被Gc后,就被回收,叫做弱引用
虚引用
PhantomReference,被new出来后就很被回收。主要用来管理堆外内存,DirectByteBuffer挂一个虚引用,作用是被jvm回收是会将对象信息放到一个队列中,给队列被监听,在有数据时回去处理相关的堆外内存