Java中的引用:强引用、软引用、弱引用、幻象引用(虚引用)

时间:2023-01-01 13:55:12

Java语言中,除了原始数据类型的变量(八大基本数据类型),其他都是引用类型,指向各种不同的对象。

理解引用对于我们掌握Java对象生命周期和JVM内部相关机制都是有帮助的。

不同的应用类型,不同之处在于对象的不同的可达性及对垃圾回收的影响。

强引用:

只要引用存在,垃圾回收器永远不会回收。例如:

Object obj = new Object(); //其中obj就是强引用。通过关键字new创建的对象所关联的引用是强引用。

特点:JVM内存空间不足时,JVM宁愿抛出OutOfMemoryError(OOM)运行时错误,使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。对于一个普通对象,如果没有其他的引用关系,只要超过了引用的作用域(如超出局部变量作用范围)或者显示将相应(强)引用赋值为null,就可以根据具体的垃圾回收机制被回收。

java.lang.ref包中提供了几个类:SoftReference类、WeakReference类和PhantomReference类,它们分别代表软引用、弱引用和虚引用。

软引用:

非必须引用,生命周期比强引用短一些,内存溢出之前进行回收。可以通过以下代码实现

ReferenceQueue queue = new ReferenceQueue();
User user = new User();
SoftReference ref=new SoftReference(user, queue);
user=null;

//其中ref是对user的一个软引用,ref.get()可以取到这个对象。此处软引用和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机会把这个软引用加入到与之相关联的引用队列中。后续,我们可以调用ReferenceQueue的poll()方法来检测是否有它所关心的对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的那个Reference对象。

应用场景: 软引用通常用来实现内存敏感的缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。

弱引用:

弱引用通过WeakReference类实现,弱引用的生命周期比软引用短,被弱引用关联的对象只能生存到下一次垃圾回收之前,。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现具有弱引用的对象,不管当前的内存空间足够与否,都会回收他的内存。(由于垃圾回收器县城是一个优先级很低的线程,因此不一定会很快回收弱引用的对象)。可通过以下代码实现:

ReferenceQueue queue = new ReferenceQueue();
WeakReference<User> sr = new WeakReference<User>(new User(),queue);
System.out.println(sr.get());
System.gc(); //通知JVM的gc进行垃圾回收
System.out.println(sr.get());

//弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

应用场景:弱引用同样是很多缓存实现的选择。

幻象引用(虚引用):

通过PhantomReference类来实现。无法通过幻象引用访问对象的任何属性或函数。幻象引用仅仅是提供一种确保对象被finalize以后,做某些事情的机制。如果一个对象仅持有幻象引用,那么他就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。可通过以下代码实现:

ReferenceQueue queue = new ReferenceQueue();
PhantomReference<User> pr = new PhantomReference<User>(new User(), queue);
System.out.println(pr.get());

//虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存前,将这个虚引用加入到关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入引用队列,就可以在多引用的对象回收前采取一些程序行动。

应用场景:可以用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾回收器回收之前会收到一条系统通知。

还有扩展知识补充需要总结。。。

Java中的引用:强引用、软引用、弱引用、幻象引用(虚引用)的更多相关文章

  1. Java中四种引用:强、软、弱、虚引用

    这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...

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

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

  3. 0030 Java学习笔记-面向对象-垃圾回收、&lpar;强、软、弱、虚&rpar;引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  4. Java&colon;对象的强、软、弱、虚引用

    转自: http://zhangjunhd.blog.51cto.com/113473/53092 1.对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...

  5. Java&colon;对象的强、软、弱和虚引用

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

  6. Java对象的强、软、弱和虚引用详解

    1.对象的强.软.弱和虚引用 转自:http://zhangjunhd.blog.51cto.com/113473/53092/ 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无 ...

  7. java基础知识再学习--集合框架-对象的强、软、弱和虚引用

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/53092 本文 ...

  8. Java对象的强、软、弱和虚引用原理&plus;结合ReferenceQueue对象构造Java对象的高速缓存器

    //转 http://blog.csdn.net/lyfi01/article/details/6415726 1.Java对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变 ...

  9. Java&colon;对象的强、软、弱和虚引用&lbrack;转&rsqb;

    原文链接:http://zhangjunhd.blog.51cto.com/113473/53092/ 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...

  10. Java对象的强、软、弱和虚引用&plus;ReferenceQueue

    Java对象的强.软.弱和虚引用+ReferenceQueue 一.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足 ...

随机推荐

  1. STM32的USART中断死循环,形成死机。

    作者:观海  QQ:531622 直接说重点:我用的是 STM32F103 芯片 USART2_IRQHandler 总是中断,程序死循环. 1.出现问题: 原程序的中断处理程序是: void USA ...

  2. VC&plus;&plus;常用数据类型转化

    char* 转换成 LPCTSTR const char* dibFileName; , , dibFileName, -, NULL, ); wchar_t *wide = new wchar_t[ ...

  3. IntelliJ IDEA使用(2)——IDEA配置Tomcat

    如果网上流传的方法(即方法2)不能配置成功,点击加号什么都没有的话,请看方法一配置方法. 解决问题:intlellij IDEA配置tomcat点击加号没东西. 方法一:手动添加tomcat插件然后再 ...

  4. 运行iis出现:The server has encountered an error while loading an application ……的解决办法【转】

    本人测试了下,第三种方法成功了. 然后经过网上搜索,3种解决方法: 第一种: MC检测到此管理单元发生一个错误.建议关闭并重新启动MMC 要变通解决此问题, 请按照下列步骤操作进入 WMI MMC 管 ...

  5. doclint in jdk8

    http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html Turning off doclint in JDK 8 ...

  6. 1,charles的功能能介绍和安装破解

    1,charles的功能 1,截取http和https网络包 2,支持重发网络请求,方便后端调试 3,支持网络请求的截获和动态修改 4,支持模拟弱化的网络 2,安装和破解 1,进入官网下载地址:htt ...

  7. Android 连续按两次back键退出系统

    需求:在程序的首页,连续按两次back键退出Androd程序. 第一步:新建一个GApplication类继承Application,在GApplication中添加一个用于存放Activity的集合 ...

  8. Tomcat分析

    最近闲来无事,总结了一下tomcat的一些知识,分享出来供大家参考,如有错误,请及时与我联系. 1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置 ...

  9. sparksql连接mysql

    1.方法1:分别将两张表中的数据加载为DataFrame /* * 方法1:分别将两张表中的数据加载为DataFrame * */ /* Map<String,String> option ...

  10. mac下搭建eclipse&plus;git环境并导入项目

    首先官网下载eclipse,然后安装,选择eclipse for java developer. 安装git插件:eclipse-help-install new software-add name随 ...