强引用
就是new出来的这个对象指向一个内存地址,这个内存地址如果一直被指针指向的话是不会被GC的,这可能会造成内存溢出OOM
User user = new User();
//只有当user设置为null 时,内存才会被垃圾回收掉
user = null;
软引用
软引用是用SoftReference来创建的对象称之为软引用,
例如现在给堆内存设置一个20M 的空间大小
先创建一个占用10M大小的软引用对象
然后再创建一个15M大小的数组对象
此时内容空间只有20M是明显不够的,这是JVM会GC一次,如果还是不够用,就会把软引用所占用的内存空间回收掉
//假设这里创建一个sr对象,他的byte占用大小是10M
SoftReference<byte[]> sr = new SoftReference<>(new byte[1024*1024*10]);
//如果此时再创建一个15M的数组对象,那么很明显,空间就不够用了,这是GC一次,如果还是不够用,就把软引用所占用的内存空间回收掉
byte[] b = new byte[1024*1024*15];
弱引用
弱引用的特点是只要JVM GC的时候都会被回收,所以这个一般很少会用到
User user = new User();
WeakReference sf = new WeakReference(user );
虚引用
就是一个虚拟出来的对象,调用对象的get方法是无效的
虚引用的作业实际上是跟踪GC过程。
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,销毁这个对象,将这个虚引用加入引用队列。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动
User user = new User();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference sf = new PhantomReference<>(user,referenceQueue);
//获取到的是null
sf.get();