转载自 Java对象引用四个级别(强、软、弱、虚)

最近,高级Java技术栈微信群中,有一些猿友在讨论JVM中对象的周期问题,有谈到引用的级别,现在为大家做个总结吧,虽然大多数公司并没有意识或者用到这些引用,但了解这些基本概念对熟悉整个垃圾回收机制和面试是非常有帮助的。

为了使程序能更加灵活地控制对象的生命周期,从JDK1.2版本开始,JDK把对象的引用级别分为了以下四种。

这4种级别由高到低依次为:

  • 强引用(StrongReference)

强引用就是我们平常最基本的对象引用,如果是强引用,那回收器不会回收带有强引用的对象。即使内存不足抛出OutOfMemoryError异常也不会回收强引用对象,存在即合理吧。

如:

User user = new User("Java技术栈"); user = new User("Java技术栈");

这就是强引用,user持有了这个对象的存储地址的引用。

  • 软引用(SoftReference)

一个对象只有软引用,如果内存空间足够情况下垃圾回收器就不会回收它,如果内存空间不够了就会对这些只有软引用的对象进行回收。只要垃圾回收器没有回收,该软引用对象就可以继续被程序使用。

所以软引用一般用来实现一些内存敏感的缓存,只要内存空间足够,对象就会保持不被回收掉。

  • 弱引用(WeakReference)

弱引用的对象具有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

弱引用可以用来实现一些规范化映射,如WeakHashMap,当key或者value不再被引用时可以自动被回收。

  • 虚引用(PhantomReference)

虚引用顾名思义就是形同虚设,虚引用并不决定对象的生命周期,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

虚引用主要用来跟踪对象被垃圾回收器回收的活动,虚引用必须和引用队列(ReferenceQueue)联合使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。

下面通过一张表格来说明它们的回收时间、用途。

引用类型 回收时间 用途
强引用 永不回收 普通对象引用
软引用 内在不足回收 缓存对象
弱引用 垃圾回收时 缓存对象
虚引用 不确定 不确定

不管这些东西平时有没有用到,我们都必须了解这些机制,这对个人的知识面及拓展是非常有帮助的。

Java对象引用四个级别(强、软、弱、虚)相关推荐

  1. JVM的四种引用:强,软,弱,虚(与gc有关)

    JVM的四种引用 强 软 弱 虚 强 gc时不回收 软 软引用对象在gc时,在内存溢出前,会回收; 弱 弱引用对象在gc时,不论内存使用情况都会回收; 虚 虚引用对象在gc后,会发送一条通知给 Ref ...

  2. 【Java】Java对象引用四个级别(强、软、弱、虚)

    文章目录 1.概述 强引用(StrongReference) 软引用(SoftReference) 弱引用(WeakReference) 虚引用(PhantomReference) 2. 扩展阅读 1 ...

  3. Java若_【JAVA基础】JAVA四种引用(强软若虚)

    java中有四种引用类型,分别是 强引用 强引用也就是我们通常认为的java中的中的引用关系 通过new创建一个对象,然后赋值给一个变量,这个时候这个变量指向堆中地址的引用就是一个强引用 他收到JVM ...

  4. java中的强软弱虚_详解Java的四种引用——强软弱虚,颠覆你的认知!

    强软弱虚 java中的数据被类型分为了两类,它们分别是基本类型和引用类型.一般我们new出来的对象都属于引用类型的范畴.我们知道java是有垃圾回收机制的一种语言,根据垃圾回收时的策略,java将对于 ...

  5. Java的四种引用——强软弱虚

    https://blog.csdn.net/hbn13343302533/article/details/106993108/

  6. android的四种对象引用级别:强、弱、软、虚引用

    android中的强引用,弱引用,软引用,虚引用.代表了android中的对象引用级别,也即代表了java的垃圾回收机制,看可以简单理解为内存释放. 1.强引用:强引用是使用最普遍的引用.如果一个对象 ...

  7. java 对象引用 弱引用吗_Java对象的强引用、软引用、弱引用和虚引用 笔记

    从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 使用最普遍的引用.如果一个对象具有强 ...

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

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

  9. java 对象引用 弱引用吗_谈谈Java对象的强引用,软引用,弱引用,虚引用分别是什么...

    整体结构 java提供了4中引用类型,在垃圾回收的时候,都有自己的各自特点. 为什么要区分这么多引用呢,其实这和Java的GC有密切关系. 强引用(默认支持模式) 把一个对象赋给一个引用变量,这个引用 ...

最新文章

  1. 01 Java面试之控制类
  2. ZooKeeper学习第二期--ZooKeeper安装配置
  3. tensorflow基础-placeholder
  4. OpenGL使用Perlin噪声的腐蚀效果
  5. maven如何将本地jar安装到本地仓库
  6. Application Verifier
  7. linux脚本写的计算器,一步步打造自己的linux命令行计算器
  8. Phonegap在ios7上系统状态栏的问题解决
  9. 电影短视频营销白皮书
  10. TCP中recv解阻塞的两种方式
  11. ST环境进行测试时,事前需要考虑的问题
  12. 华为笔试题:词频统计
  13. 前阿里GOC负责人葛梅:运维转型运营,IT服务管理体系搭建实践
  14. 第10章第13节:使用iSlide的图标库往幻灯片中插入一枚图标 [PowerPoint精美幻灯片实战教程]
  15. 推荐几本大学生必看的书单
  16. 项目组自己编写的js分页标签(百度分页)
  17. 微信小程序音乐播放器实践
  18. 330tsl是什么意思_大众途观2015款车尾330tsl是什么意思
  19. App 上线被拒绝的原因有哪些?
  20. 玩转冷板式液冷 你需要一份靠谱的“设计参考”

热门文章

  1. 集合的定义与并查操作(C语言)
  2. Java实现栈(顺序栈,链栈)
  3. 线性表的定义与操作-顺序表,链式表(C语言)
  4. 洛谷T172100 商店-贪心
  5. Linux 文本格式显示折线图,linux 折线图
  6. 哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding
  7. P2662 牛场围栏(同余最短路)
  8. Codeforces Round #590 (Div. 3) F. Yet Another Substring Reverse 子集dp
  9. 【WC2018】通道【边分治】【虚树】【树的直径】
  10. 【SPOJ2666】QTree4【链分治】