一、整体架构

二、强引用(默认支持)

当内存不足,JVM 开始垃圾回收,对于强引用的对象,就算是出现了 OOM 也不会对该对象进行回收,死都不收。强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾回收器不会碰这种对象。在Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成内存泄漏的主要原因之一。对于一个普通对象,如果没有其他引用关系,只要超过引用的作用域或者显示地将强应用设置为null,一般就可以被垃圾收集。(当然具体回收时机是要看垃圾收集策略)。

1 public classReferenceDemo {2 public static voidmain(String[] args) {3 //o1 强引用(默认)

4 Object o1 = newObject();5 //o2 引用赋值

6 Object o2 =o1;7 //将o1 置为null

8 o1 = null;9 //触发垃圾回收,回收o1

10 System.gc();11 //查看 o2 是否有变化12 //输出结果:java.lang.Object@5305068a 说明o2 没有被回收,属于强引用

13 System.out.println(o2);14 }15 }

三、软引用

软引用是一种相对强引用弱化了一些的引用,需要用 java.lang.ref.SoftReference 类来实现,可以让对象豁免一些垃圾收集。对于弱引用来说:

【1】当系统内存充足时它不会被回收;

1 public classReferenceDemo {2 public static voidmain(String[] args) {3 //o1 强引用(默认)

4 Object o1 = newObject();5 //o2 引用赋值 ************重点***************

6 SoftReference softReference = new SoftReference<>(o1);7 //java.lang.Object@5305068a

8 System.out.println(o1);9 //将o1 置为null

10 o1 = null;11 //触发垃圾回收,回收o1

12 System.gc();13 //查看 o2 是否有变化14 //输出结果:java.lang.ref.SoftReference@5305068a 说明softReference 没有被回收,因为内存充足

15 System.out.println(softReference.get());16 //输出结果:null

17 System.out.println(o1);18 }19 }

【2】当系统内存不充足时它会被回收;代码演示:准备工作,设置内存大小为10m,具体配置如下:

1 @org.junit.Test2 public voidsoftReference(){3 //o1 强引用(默认)

4 Object o1 = newObject();5 //o2 引用赋值

6 SoftReference softReference = new SoftReference<>(o1);7 //将o1 置为null

8 o1 = null;9 try{10 //模拟内存不足,我们通过 Xms和Xmx分配10M 的内存

11 byte[] bytes = new byte[20*1024*1024];12 }catch(Exception e){13 e.printStackTrace();14 }finally{15 //通过get 方法获取应用对象,输出结果为:null 说明内存不足时对此进行了回收

16 System.out.println(softReference.get());17 }18 }

软引用通常用于对内存敏感的程序中,比如高速缓冲就有用到软引用,内存够用的时候就保留,不够就回收!

四、弱引用

弱引用需要用 java.lang.ref.WeakReference 类实现,它比软引用的生存期更短,对于只有软引用的对象来说,只要垃圾回收机制一运行,不管JVM 内存是否足够,都会回收该对象占用的内存。

1 @org.junit.Test2 public voidweakReference(){3 //o1 强引用(默认)

4 Object o1 = newObject();5 //o2 引用赋值

6 WeakReference weakReference = new WeakReference<>(o1);7 //输出结果:java.lang.Object@1b701da1

8 System.out.println(weakReference.get());9 //将o1 置为null

10 o1 = null;11 System.gc();12 //通过get 方法获取应用对象,输出结果为:null 说明只要进行过gc 就可能被回收

13 System.out.println(weakReference.get());14 }

五、虚引用

虚引用需要 java.lang.ref.PhantomReference 类来实现。顾名思义,就是形同虚设,与其它几种引用不同,虚引用并不会决定对象的声明周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收,它不能单独使用也不能通过它访问对象,虚引用必须和引用队列(ReferenceQueue)联合使用。

虚引用的主要作用是跟踪对象被垃圾回收的状态,仅仅是提供一种确保对象被 finalize 以后,做某些事情的机制。PhantomReference 的 get方法总是返回 null,因此无法访问对应的引用对象。其意义在于说明一个对象已经进入 finalization 阶段,可以被 gc 回收,用来实现比 finalization 机制更灵活的回收操作。

换句话说,设置虚拟引用的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步处理。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

1 @org.junit.Test2 public voidphantomReference(){3 //o1 强引用(默认)

4 Object o1 = newObject();5 //引用队列

6 ReferenceQueue referenceQueue = newReferenceQueue();7 //创建虚引用

8 PhantomReference phantomReference = new PhantomReference<>(o1, referenceQueue);9 System.out.println("GC 之前===================");10 System.out.println("o1 = "+o1);11 System.out.println("phantomReference = "+phantomReference.get());12 System.out.println("referenceQueue = "+referenceQueue.poll());13

14 //垃圾回收

15 o1=null;16 System.gc();17

18 System.out.println("GC 之后===================");19 System.out.println("o1 = "+o1);20 System.out.println("phantomReference = "+phantomReference.get());21 System.out.println("referenceQueue = "+referenceQueue.poll());22 }

输出结果展示:

强java_Java (强/弱/软/虚)引用相关推荐

  1. java中四种引用类型(对象的强、软、弱和虚引用)

    2019独角兽企业重金招聘Python工程师标准>>> 对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

  2. 对象的强、软、弱和虚引用

    本文介绍对象的强.软.弱和虚引用的概念.应用及其在UML中的表示. 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有 ...

  3. Java:对象的强、软、弱和虚引用

    见:http://zhangjunhd.blog.51cto.com/113473/53092 maven/Java/web/bootstrap/dataTable/app开发QQ群:56686262 ...

  4. 软引用和弱引用的区别_强、软、弱、虚引用的区别和使用

    原文阅读: 强.软.弱.虚引用的区别和使用​mp.weixin.qq.com Java提供了四种级别的应用类型:强引用.软引用.弱引用及虚引用.那么这四种引用类型有什么区别呢? 首先我们通过一张图来看 ...

  5. java-基础-强、软、弱、虚引用

    Java的四种引用,强弱软虚,用到的场景. JDK1.2之前只有强引用,其他几种引用都是在JDK1.2之后引入的. 强引用(Strong Reference) 最常用的引用类型,如Object obj ...

  6. jvm系列 (四) ---强、软、弱、虚引用

    java引用 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 我的博客目录 为什么将引用分为不同的强度 因为我们需要实现这样一种情 ...

  7. (五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析

    引言 在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内.而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程.J ...

  8. Java 强引用与软引用以及弱引用,虚引用

    1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使 用它.从JDK ...

  9. Java四种引用包括强引用,软引用,弱引用,虚引用。

    强引用: 只要引用存在,垃圾回收器永远不会回收 Object obj = new Object(); //可直接通过obj取得对应的对象 如obj.equels(new Object()); 而这样 ...

最新文章

  1. 微信小程序 封装网络请求并调用
  2. spark 资源参数调优
  3. Python scrapy 动态传入自定义参数
  4. 有关Dispose,Finalize,GC.SupressFinalize函数-托管与非托管资源释放的模式
  5. 电商产品评论数据情感分析代码详解
  6. 老年代的更新机制_如何理解Java GC机制
  7. logrotate 命令切换linux系统日志
  8. MTK:DrvGen驱动的使用
  9. Inpaint for Mac(图片去水印软件)
  10. SecureCRT for Mac(强大的终端SSH工具)
  11. HG255D[OpenWrt]刷机
  12. MySQL定时备份数据库(全库备份)
  13. 83页XX市高速智慧公路总体建设方案
  14. mariadb-libs 被 mysql-community-libs-compat-8.0.26-1.el7.x86_64 取代
  15. vue导入音乐_vue中添加mp3音频文件的方法
  16. 2021数学建模国赛B题复盘详细解析
  17. layui.table(表格)跨页多选
  18. 小程序分享功能以及坑
  19. ebuy遇到的问题以及解决方法
  20. OFDM正交频分复用——详解——5G-LTE知识必备

热门文章

  1. iOS之LLVM编译流程和Clang插件开发集成
  2. 【数据结构与算法】之深入解析“基本计算器”的求解思路与算法示例
  3. 111. Minimum Depth of Binary Tree 二叉树的最小深度
  4. marked Options
  5. Jenkins 创建Maven项目
  6. 深度学习——02、深度学习入门 8-14
  7. Java中三种交换值得方式
  8. 【Linux】一步一步学Linux——groupadd命令(87)
  9. ubantu 16.04 mysql_Ubuntu 16.04下安装MySQL
  10. buffsize 缓冲区的大小多少合适_6人餐桌尺寸规格一般是多少