Java 强 软 弱 虚 四种引用

文章目录

  • 强引用
  • 软引用
  • 弱引用
  • 虚引用

强引用

  • 对于强引用,是我们最常见的,比如直接创建一个对象:Object obj = new Object(); 那么ojb就是一个强引用。在当前栈帧有效的作用域内,是永远不会被回收的。

  • 只要不是null,就不会被gc回收。

package com.heima.freemarker.reference;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class SoftReferenceTest {public static void main(String[] args) throws IOException {// 强引用byte[] list = new byte[1024];// gc之前,list指向System.out.println("before gc :" + list);// gcSystem.gc();// gc之后,list指向System.out.println("after gc :" + list);}
}

在这里插入图片描述

软引用

  • 软引用是指被SoftReference类实现的引用。它的特征是当前系统有足够的的内存的时候,它能够存活;当系统内存不足时,它会被gc回收。
  • 使用场景:适合做缓存。
package com.heima.freemarker.reference;import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;public class SoftReferenceTest {public static void main(String[] args) {// 软引用 占用1M内存SoftReference<byte[]> str = new SoftReference<>(new byte[1024*1024]);// list变量指向是强引用List list = new ArrayList<>();int i = 0;while (true) {// 死循环,每次消耗1M内存list.add(new byte[1024 * 1024]);// 查看软引用什么时候被回收System.out.println("第" + ++i + "次时,软引用的内容为:" + str.get());}}
}

在这里插入图片描述

弱引用

  • gc 会直接回收
package com.heima.freemarker.reference;import java.io.IOException;
import java.lang.ref.WeakReference;public class SoftReferenceTest {public static void main(String[] args) throws IOException {// 弱引用WeakReference<byte[]> weakReference = new WeakReference<>(new byte[1024]);// 垃圾回收前System.out.println("before gc : " + weakReference.get());// gcSystem.gc();// 垃圾回收后System.out.println("after gc : " + weakReference.get());}
}

在这里插入图片描述

虚引用

  • 必须搭配队列使用。
  • 使用场景:管理堆外内存
package com.heima.freemarker.reference;import java.io.IOException;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;public class SoftReferenceTest {public static void main(String[] args) throws IOException {// 队列ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();// 虚引用PhantomReference phantomReference = new PhantomReference(new byte[1024], referenceQueue);// 垃圾回收前System.out.println("before gc : " + phantomReference.get());System.out.println("before gc : " + referenceQueue.poll());// gcSystem.gc();// 垃圾回收后System.out.println("after gc : " + phantomReference.get());System.out.println("after gc : " + referenceQueue.poll());}
}

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部