Java 四种引用的解读
Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用。
1. 强引用(StrongReference)
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
只要引用存在,垃圾回收器永远不会回收。
例如:
Object object = new Object(); String str = "hello";
但是我们也知道,不是所有的强引用在任何时间都是有效的,那jvm如何处理的呢?
如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。
比如Vector类的clear方法中就是通过将引用赋值为null来实现清理工作的:
public synchronized E remove(int index) { modCount++; if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); Object oldValue = elementData[index]; int numMoved = elementCount - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--elementCount] = null; // Let gc do its work return (E)oldValue; }
2. 软引用(SoftReference)
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
public static void main(String[] args) { SoftReference<String> sr = new SoftReference<String>(new String("hello")); System.out.println(sr.get()); }
控制台打印一hello,当内存不足时,会回收这部分对象。
3. 弱引用(WeakReference)
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
public static void main(String[] args) { WeakReference<String> sr = new WeakReference<String>(new String("hello")); System.out.println(sr.get()); System.gc(); System.out.println(sr.get()); }
控制台打印:
hello null
可以看到,只要显示调用gc,弱引用对象就被回收。
4. 虚引用(PhantomReference)
形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。
public static void main(String[] args) { ReferenceQueue<String> queue = new ReferenceQueue<String>(); PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue); System.out.println(pr.get()); }
null
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
springMVC
版权声明:本文为博主原创文章,未经博主允许不得转载.https://blog.csdn.net/w1lgy/article/details/82085628 学习springMVC需要Javaweb的基础,有需要的朋友可以先看看这两篇博客再来学习此论内容会容易接受:JavaWeb基础知识点之一Servlet,JavaWeb基础知识点。 一,什么是MVC MVC全名是模型视图控制器,是模型(模型) - 视图(视图) - 控制器(控制器)的缩写,一种软件设计典范,用一种业务逻辑,数据,界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入,处理和输出功能在一个逻辑的图形化用户界面的结构中。 二,用SpringMVC用 1,组件: 如图1所示,前端控制器的DispatcherServlet的(不需要程序员开发,只需要在web.xml中中中配置) 作用:接收请求,响应结果,相当于转发器,中央处理器有了的DispatcherServlet的减少了其它组件之间的耦合度。 2,处理器映射器的的...
- 下一篇
入门 | 关于TensorFlow,你应该了解的9件事
我总结了今年 Google Cloud Next 大会上我最爱的一段演讲——What's New with TensorFlow?(https://www.youtube.com/watch?v=MR7w8ARAS2Y) 然后我想了想,简直找不出理由不向你们安利我对此演讲的超短总结。(除非你不看视频,不然你绝对应该看看这个演讲,演讲者 Laurence Moroney 很出色。) #1:TensorFlow 是一个强大的机器学习框架 TensorFlow 是一个机器学习框架,如果你有大量的数据,或者你在追求人工智能最先进的技术:深度学习、神经网络等,它都会使你如虎添翼。它可不是数据科学界的瑞士军刀,而是工业车床!如果你想做的只是通过 20×2 的电子表格绘制一条回归线,那你可以停止阅读本文了。 但如果你追求的是更大的目标,那就嗨起来吧~TensorFlow 被用于寻找新的行星,协助医生检查糖尿病性视网膜病变来预防患者失明,向当局报告非法砍伐行为来拯救森林。它是 AlphaGo 和 Google Cloud Vision 的基础,也会是属于你的。TensorFlow 是开源的,你可以免费...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果