JDK1.2之前,一个对象只有“已被引用”和“未被引用”两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。

JDK1.2之后,Java对引用的概念进行了扩充,将引用分为了:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)4 种,这 4 种引用的强度依次减弱,分别介绍一下这4种引用类型。

强引用

Java中默认声明的就是强引用,代码之中普遍存在的类似Object obj=new Object()这类的引用。

只要强引用还存在, 垃圾收集器永远不会回收掉被引用的对象。哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。

如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了。

Object 

软引用

一些还有用但并非必需的对象

系统将要发生内存溢出异常之前, 将会把这些对象列进回收范围之中进行第二次回收。 如果这次回收还没有足够的内存, 才会抛出内存溢出异常。

这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。

在 JDK1.2 之后,提供了SoftReference类来实现软引用

/**

打印结果:

[B@cb5822

打印结果总是只有后面几个对象被保留,其他的obj全都被置空回收了。这里就说明了在内存不足的情况下,软引用将会被自动回收。

值得注意的一点 , 即使有 byte[] buff 引用指向对象, 且 buff 是一个strong reference, 但是 SoftReference sr 指向的对象仍然被回收了,这是因为Java的编译器发现了在之后的代码中, buff 已经没有被使用了, 所以自动进行了优化。

弱引用

非必需对象, 但是它的强度比软引用更弱一些。

被弱引用关联的对象只能生存到下一次垃圾收集发生之前。 当垃圾收集器工作时, 无论当前内存是否足够, 都会回收掉只被弱引用关联的对象。

在 JDK1.2 之后,提供了WeakReference类来实现弱引用。

import 

运行结果:

null
null
null
null
null
null
null
null
null
null

可以发现所有被弱引用关联的对象都被垃圾回收了。

虚引用

最弱的一种引用关系。

一个对象是否有虚引用的存在, 完全不会对其生存时间构成影响(虚引用并不会决定对象的生命周期,有他没他都一个样),也无法通过虚引用来取得一个对象实例。

虚引用的的对象存活周期并不能确定,对象可能在任何时候被回收。

为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。 换句话说这就是起到了一个哨兵的作用。

在 JDK1.2 之后,提供了PhantomReference类来实现虚引用。

public 

通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,如上面所说,将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。

引用队列(ReferenceQueue)

引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。

与软引用、弱引用不同,虚引用必须和引用队列一起使用。

//引用队列,当引用的对象被回收后,Reference对象本身会被添加到referenceQueue中,

总结

程序设计中一般很少使用弱引用与虚引用,使用软用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。

无法获取未定义或 null 引用的属性“title”_JDK中四种对象引用类型相关推荐

  1. vue调用 webVideoCtrl.js 海康设备调试 无法获取未定义或 null 引用的属性“HWP_SubmitHttpRequest”

    海康网页端开发遇到 无法获取未定义或 null 引用的属性"HWP_SubmitHttpRequest" 经过代码调试后,发现原因: 没有指定视频展示对应的div 解决方法: // ...

  2. SCRIPT5007: 无法获取未定义或 null 引用的属性“call”

    问题 ie浏览器中打开vue项目时报错:SCRIPT5007: 无法获取未定义或 null 引用的属性"call" 解决方法 1.确保webpack版本在 2.6.1以上 2.安装 ...

  3. ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...

    JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...

  4. 无法获取未定义或 null 引用的属性“text”_【CSS】是时候开始用 CSS 自定义属性了...

    自定义属性(有时候也被称作CSS变量或者级联变量)是由CSS作者定义的,它包含的值可以在整个文档中重复使用.由自定义属性标记设定值(比如:--main-color: black;),由var() 函数 ...

  5. 无法获取未定义或 null 引用的属性“value”_SpringBoot之Spring@Value属性注入使用详解

    在使用Spring框架的项目中,@Value是使用比较频繁的注解之一,它的作用是将配置文件中key对应的值赋值给它标注的属性.在日常使用中我们常用的功能都比较简单,本篇文章系统的带大家来了解一下@Va ...

  6. 【Javascript报错】无法获取未定义或 null 引用的属性“replace“

    今天在处理前端字符串替换的问题中 使用了这段代码: str.replace("xx","xx") 报错 >>  是因为str没获取到 str = u ...

  7. 使用阿里妈妈字体图标库,ie10报错,无法获取未定义或 null 引用的属性“firstChild”

    前因:公司优化页面,要把彩色图片,换成字体图标. 结果:更换完后,测试发现ie10,ie9都会报错,但demo测试是没有问题的. 测试:console.log(target)为null,找到docum ...

  8. DataTables在IE8下报'style' 为空或不是对象错误问题 , SCRIPT5007: 无法获取未定义或 null 引用的属性“style”

    网页错误详细信息: 消息: 'style' 为空或不是对象 行: 5570 字符: 5 代码: 0 检查后才发现,问题在于数组最后多了一个",",会造成Table列数计算时多了一列 ...

  9. 无法设置未定义或 null 引用的属性innerText

    今天在测试的过程中,ie环境下一直在报"无法设置未定义或 null 引用的属性"value"",在网上也搜了很多结果,有的说是引用的jquery版本太高导致的, ...

最新文章

  1. echarts切换折线图变大_这个月,我就和折线图杠上了...
  2. gbk与utf-8的区别
  3. 移动开发平台性能比较
  4. mysql2008安装中文_Microsoft SQL Server 2008 R2 中文安装说明
  5. plsql无法连接64位oracle数据库的解决方法(图文解说)
  6. linux下c语言利用iconv函数实现utf-8转unicode
  7. linux scp限制传输速度
  8. CentOS 安装MySQL5.7 源码方式安装
  9. Zookeeper及客户端的基本操作
  10. array_filter()用法
  11. 转盘抽奖的案例-----
  12. NetBeans的下载、安装
  13. MySQL原理与实践(六):自增主键的使用
  14. [置顶] 跳槽前夕的三年总结
  15. unity打开设置虚拟键的界面
  16. 批量wod转pdf、批量excle转pdf、pdf转excle、word实现方案
  17. Python WOE的使用
  18. Python:flatten()函数用法
  19. 《软件学报》《计算机学报》《计算机研究与发展》为计算机类三大权威刊物
  20. OJ-3084 返回指针的函数

热门文章

  1. ubuntu16.04安装docker(阿里云镜像)
  2. Python数据分析之全球人口数据
  3. Flask 中的上下文管理和请求钩子
  4. ASP.NET企业开发框架IsLine FrameWork系列之六--DataProvider 数据访问(下)
  5. java web中读取properties文件时的路径问题
  6. HTML-meta标签
  7. 面试题11. 旋转数组的最小数字
  8. django+mysql+插入数据库网页展示内容
  9. SpringMVC 运行原理及主要组件
  10. 210 - Concurrency Simulator