摘要:为了使程序能更加灵活地控制对象的生命周期,从版本开始,把对象的引用级别分为了以下四种。如技术栈这就是强引用,持有了这个对象的存储地址的引用。
最近,高级Java技术栈微信群中,有一些猿友在讨论JVM中对象的周期问题,有谈到引用的级别,现在为大家做个总结吧,虽然大多数公司并没有意识或者用到这些引用,但了解这些基本概念对熟悉整个垃圾回收机制和面试是非常有帮助的。
为了使程序能更加灵活地控制对象的生命周期,从JDK1.2版本开始,JDK把对象的引用级别分为了以下四种。
这4种级别由高到低依次为:
强引用(StrongReference)
强引用就是我们平常最基本的对象引用,如果是强引用,那回收器不会回收带有强引用的对象。即使内存不足抛出OutOfMemoryError异常也不会回收强引用对象,存在即合理吧。
如:
User user = new User("Java技术栈");
这就是强引用,user持有了这个对象的存储地址的引用。
软引用(SoftReference)
一个对象只有软引用,如果内存空间足够情况下垃圾回收器就不会回收它,如果内存空间不够了就会对这些只有软引用的对象进行回收。只要垃圾回收器没有回收,该软引用对象就可以继续被程序使用。
所以软引用一般用来实现一些内存敏感的缓存,只要内存空间足够,对象就会保持不被回收掉。
弱引用(WeakReference)
弱引用的对象具有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以用来实现一些规范化映射,如WeakHashMap,当key或者value不再被引用时可以自动被回收。
虚引用(PhantomReference)
虚引用顾名思义就是形同虚设,虚引用并不决定对象的生命周期,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动,虚引用必须和引用队列(ReferenceQueue)联合使用,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
下面通过一张表格来说明它们的回收时间、用途。
引用类型 | 回收时间 | 用途 |
---|---|---|
强引用 | 永不回收 | 普通对象引用 |
软引用 | 内在不足回收 | 缓存对象 |
弱引用 | 垃圾回收时 | 缓存对象 |
虚引用 | 不确定 | 不确定 |
不管这些东西平时有没有用到,我们都必须了解这些机制,这对个人的知识面及拓展是非常有帮助的。
推荐阅读干货:Spring Boot & Cloud 最强技术教程
工具:推荐一款在线创作流程图、思维导图软件
分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71386.html
摘要:弱引用弱引用比软引用更弱,被弱引用关联的对象只能存活到发生下一次垃圾回收之前,也就是说当发生时,无论当前内存是否足够,都会被回收掉。这是最终的状态,不能再变为其它状态。如下图所示对象都是可被回收的。 【干货点】看完该篇文章,就基本可以解答面试热点【谈谈对Java中几种引用的理解】了。 大家都知道我公众号的副业是 showImg(https://segmentfault.com/img/...
摘要:当一个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不可能被系统垃圾回收机制回收。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和引用队列联合使用。 当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制具有如下...
摘要:在之后,对引用的概念进行了扩充,将引用分为强引用软引用弱引用虚引用种,这种引用强度依次逐渐减弱。软引用是用来描述一些还有用但并非必需的对象。虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。 以下内容摘自《深入理解Java虚拟机 JVM高级特性与最佳实践》第2版,强烈推荐没有看过的同学阅读,读完的感觉就是原来学的都是些什么瘠薄东西(╯‵□′)╯︵┴─┴ 在JDK1.2以前,Ja...
摘要:强引用如果一个对象具有强引用垃圾回收器绝不会回收它当内存空间不足时虚拟机宁愿抛出错误使程序异常终止也不会靠随意回收具有强引用的对象来解决内存不足问题软引用如果内存空间充足垃圾回收器就不会回收它如果内存空间不足就会回收这些对象的内存只要垃圾回 强引用 如果一个对象具有强引用,垃圾回收器绝不会回收它.当内存空间不足时,java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终...
内部类 内部类主要作用 内部类提供了更好的封装,可以吧内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。 内部类成员可以直接访问外部类的私有数据,因为内部类被当成其外部类成员,同一个类的成员之间可以互相访问,但外部类不能访问内部类的实现细节。 匿名内部类适合用于创建那些仅需要使用一次的类。 定义内部类与外部类的语法大致相同,内部类除需要定义在其他类里面之外,还有两点区别: 内...
阅读 1583·2019-08-29 13:53
阅读 3190·2019-08-29 13:50
阅读 824·2019-08-27 10:51
阅读 542·2019-08-26 18:36
阅读 1714·2019-08-26 11:00
阅读 583·2019-08-26 10:36
阅读 3184·2019-08-23 17:58
阅读 2005·2019-08-23 15:17