【Java 的四大引用详解】
创始人
2025-01-10 04:03:09
0次

首先分别介绍一下这几种引用

image.png

强引用: 只要能通过GC ROOT根对象引用链找到就不会被垃圾回收器回收,当所有的GC Root都不通过强引用引用该对象时,才能被垃圾回收器回收。

软引用(SoftReference): 当只有软引用引用该对象时,在垃圾回收之后内存仍然不足会再次发起垃圾回收,这时会回收掉软引用对象,我们可以配合引用队列来释放软引用自身。

弱引用: 当发生垃圾回收时,无论内存是否够用,只有软引用的对象都会被垃圾回收器回收

虚引用: 必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入引用队列, 由 Reference Handler 线程调用虚引用相关方法释放直接内存。

终结器引用: 无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象 暂时没有被回收),再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize 方法,第二次 GC 时才能回收被引用对象

实例

强引用 首先我们设置内存大小为20MB

image.png

    public class Demo2_3 {         private static final int _4MB = 4 * 1024 * 1024;         public static void main(String[] args) throws IOException {              ArrayList list = new ArrayList<>();              for (int i = 0; i < 5; i++) {                 list.add(new byte[_4MB]);             }             System.in.read();         }          } 

启动main,因为强引用无法被垃圾回收会发生内存溢出,报错内存不足无法启动 image.png

弱引用 应用场景

public class Demo2_4 {      private static final int _4MB = 4 * 1024 * 1024;      //软引用,当堆内存空间不足时,会回收来释放内存空间     public static void main(String[] args) throws IOException {          //list ---> SoftReference ---> byte[] list先引用了软引用对象SoftReference,软引用对象SoftReference再间接引用byte         List> list = new ArrayList<>();          for (int i = 0; i < 5; i++) {             //引用对象关联引用队列,当软引用所关联的byte[]被回收时,软引用自己会加入到引用队列queue中去             SoftReference ref = new SoftReference<>(new byte[_4MB]);             System.out.println(ref.get());             list.add(ref);             System.out.println(list.size());          }         System.out.println("循环结束:" + list.stream());         for (SoftReference softReference : list) {             System.out.println(softReference.get());         }     } }  

运行:

image.png

查看打印结果,程序在第四次循环的时候内存不足触发了垃圾回收,此时将前面的软引用的对象给回收了,所以我们最后打印结果只有第五个对象不为null

同时我们还可以配合引用队列来释放软引用自身

public class Demo2_3 {      private static final int _4MB = 4 * 1024 * 1024;      public static void main(String[] args) throws IOException { //list ---> SoftReference ---> byte[] list先引用了软引用对象SoftReference,软引用对象SoftReference再间接引用byte         List> list = new ArrayList<>();         //引用队列         ReferenceQueue queue = new ReferenceQueue<>();         for (int i = 0; i < 5; i++) {             //引用对象关联引用队列,当软引用所关联的byte[]被回收时,软引用自己会加入到引用队列queue中去             SoftReference ref = new SoftReference<>(new byte[_4MB],queue);             System.out.println(ref.get());             list.add(ref);             System.out.println(list.size());          }         //poll方法就是从队列中获取最先放入队列的元素移除队列         //从队列中获取无用的软引用对象并移除         Reference poll = queue.poll();         while (poll != null){             list.remove(poll);             poll = queue.poll();          }         System.out.println("循环结束:" + list.stream());         for (SoftReference softReference : list) {             System.out.println(softReference.get());         }     } } 

运行程序:

image.png

前四次循环的软引用自身已经被释放

弱引用: 应用场景举例

public class Demo2_5 {      private static final int _4MB = 4 * 1024 * 1024;      public static void main(String[] args) {         ArrayList> list = new ArrayList<>();         for (int i = 0; i < 8; i++) {             WeakReference ref = new WeakReference<>(new byte[_4MB]);             list.add(ref);             for (WeakReference w : list) {                 System.out.print(w.get()+" ");             }             System.out.println();         }         System.out.println("循环结束:"+list.size());     } } 

运行程序:

image.png

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...