1.强引用
我们一般new一个对象,然后指向这个对象的引用就是强引用。
只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了
2.软引用
软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
package leetcode0606.RefType;
import java.lang.ref.SoftReference;
public class SoftRef {
// 适合做缓存
// 空间不够了,软引用会被干掉
public static void main(String[] args) {
//开辟一个10M的堆内存,假设我的堆内存为20M
SoftReference softReference = new SoftReference<>(new byte[1024*1024*10]);
System.out.println(softReference);
byte[] bytes = new byte[1024*1024*15];
}
}
3.弱引用
相当于没引用,假如在堆内存中,那么GC会直接回收。
无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收
主要应用:ThreadLocal的set方法
4.虚引用
get不到的对象,虚引用指向的对象被GC回收时,会被扔到一个引用队列里。
当GC线程发现引用队列中加入了新元素,那么我看一下她有没有指向堆外内存,有的话借助JVM进行清理。
package leetcode0606.RefType;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class PhantomRef {
//用于直接内存
public static void main(String[] args) {
byte[] byete=new byte[1024];
ReferenceQueue<Object> objectReferenceQueue = new ReferenceQueue<>();
PhantomReference<Object> objectPhantomReference = new PhantomReference<>(byete,objectReferenceQueue);
}
}