Java的四种引用,强弱软虚

简介:

软,内存不足时回收 , 内存缓存使用

弱,强度比软还弱,只能活到下一个GC

虚,唯一用途是在回收时会收到系统通知。NIO直接内存的自动回收就用到了这个。

弱引用的作用在于解决强引用所带来的对象之间在存活时间上的耦合关系。弱引用最常见的用处是在集合类中,尤其在哈希表中。哈希表的接口允许使用任何Java对象作为键来使用。当一个键值对被放入到哈希表中之后,哈希表对象本身就有了对这些键和值对象的引用。如果这种引用是强引用的话,那么只要哈希表对象本身还存活,其中所包含的键和值对象是不会被回收的。如果某个存活时间很长的哈希表中包含的键值对很多,最终就有可能消耗掉JVM中全部的内存。


在介绍幽灵引用之前,要先介绍Java提供的对象终止化机制finalization)。在Object类里面有个finalize方法,其设计的初衷是在一个对象被真正回收之前,可以用来执行一些清理的工作。因为Java并没有提供类似C++的析构函数一样的机制,就通过finalize方法来实现。但是问题在于垃圾回收器的运行时间是不固定的,所以这些清理工作的实际运行时间也是不能预知的。幽灵引用(phantom reference)可以解决这个问题。在创建幽灵引用PhantomReference的时候必须要指定一个引用队列。当一个对象的finalize方法已经被调用了之后,这个对象的幽灵引用会被加入到队列中。通过检查该队列里面的内容就知道一个对象是不是已经准备要被回收了。


http://www.kuqin.com/shuoit/20141019/342724.html


软引用可以创建内存中的缓存,它与程序的整体内存需求有关。(memory-sensitive cache)。

弱引用可以创建规范映射(canonicalizing mappings),比如哈希表,它的关键字和值在没有其他程序部分的引用时可以从映射中清除。

规范映射:对象实例可以在程序的多个地方同时使用。从而节约存储,但不能防止键(或值)被回收。

影子引用可以实现终结方法以外的更加复杂的临终清理政策。

要使用软引用或者弱引用的目标,可以调用引用对象的get()方法,如果该引用目标还没有没清除,则会得到对引用目标的一个强引用,就可以用通常的方法去使用了,如果引用目标被清除,则返回null。

如果调用影子引用对象的get()方法,只能得到null,即使影子引用还没有清除,也就是说,如果到达了影子可触及状态,则不能再被复活。

虚拟机的实现需要在抛出OutOfMemoryError之前清除软引用,但在其他情况下可以自行选择清理的时间或是否清除它们。实现最好只在内存不敷所需时才去清除软链接,清除的时候先清除老的而不是新的,清除长期未用的而不是最近刚刚用过的。

垃圾收集器在判断出对象处于弱连接状态时就立即清除弱引用。

影子可触及性表示对象即将被回收,可以利用队列中影子应用的到达来触发一些希望在对象生命周期的最后时刻需要完成的动作。完成了影子可触及对象的临终清理后,必须调用指向它的影子引用对象的clear()方法,调用之后就到达了不可触及状态。


软引用、弱引用对象在创建时可以选择不和引用队列关联,而影子引用对象没有关联的引用队列就无法创建实例。

幽灵引用及其队列的使用情况并不多见,主要用来实现比较精细的内存使用控制,这对于移动设备来说是很有意义的。程序可以在确定一个对象要被回收之后,再申请内存创建新的对象。通过这种方式可以使得程序所消耗的内存维持在一个相对较低的数量。

对于这种情况的解决办法就是使用弱引用来引用这些对象,这样哈希表中的键和值对象都能被垃圾回收。Java中提供了WeakHashMap来满足这一常见需求。










本文转自里冲51CTO博客,原文链接: http://blog.51cto.com/coollast/1112882,如需转载请自行联系原作者





相关文章
|
3月前
|
安全 Java
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
从零开始学习 Java:简单易懂的入门指南之不可变集合、方法引用(二十六)
|
4天前
|
Java
Java基础之对象的引用
Java基础之对象的引用
5 0
|
1月前
|
存储 Java C语言
【Java】以数组为例简单理解引用类型变量
【Java】以数组为例简单理解引用类型变量
15 1
|
1月前
|
缓存 Java
Java四个引用
Java四个引用
|
1月前
|
Java
[java进阶]——方法引用改写Lambda表达式
[java进阶]——方法引用改写Lambda表达式
|
4月前
|
Java
java 父类引用指向子类对象
java 父类引用指向子类对象
25 0
|
4月前
|
Java
Java中引用的概念
Java中引用的概念
32 1
|
4月前
|
Java
【Java代码】使用双冒号 :: 简洁代码及方法引用(静态方法+构造方法+实例方法+函数式编程举例)
【Java代码】使用双冒号 :: 简洁代码及方法引用(静态方法+构造方法+实例方法+函数式编程举例)
28 0
|
4月前
|
存储 Java
Java之Stream流及方法引用的详细解析二
2.6Stream流综合练习【应用】 案例需求 现在有两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作 男演员只要名字为3个字的前三人 女演员只要姓林的,并且不要第一个
51 0
|
4月前
|
数据采集 Java API
Java 正则表达式【非贪婪匹配、格式验证、反向引用、API】
Java 正则表达式【非贪婪匹配、格式验证、反向引用、API】