java 幽灵引用_Java的四种引用,强弱软虚

news/2024/7/24 12:18:05 标签: java 幽灵引用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


http://www.niftyadmin.cn/n/1251535.html

相关文章

一个由设计稿智能生成代码的神器

一个由设计稿智能生成代码的神器imgcook,一个由设计稿智能生成代码的神器imgcook 是专注以各种图像(Sketch/PSD/静态图片)为原材料烹饪的匠心大厨,通过智能化手段将各种视觉稿一键生成可维护的前端代码,切实提高前端的…

java格式化jquery数据_[Java教程]前端js、jQuery实现日期格式化、字符串格式化

[Java教程]前端js、jQuery实现日期格式化、字符串格式化0 2015-10-14 18:00:051. js仿后台的字符串的StringFormat方法在做前端页面时候,经常会对字符串进行拼接处理,但是直接使用字符串拼接,不但影响阅读,而且影响执行效率&#…

『前端优化』Vue中避免滥用this去读取data中数据

前言在Vue中,data选项是个好东西,把数据往里一丢,在一个Vue组件中任何一个地方都可以通过this来读取data中数据。但是要避免滥用this去读取data中数据,至于在哪里要避免滥用,如果滥用会导致什么后果,本专栏…

新版犀牛书该不该入手?来一次开箱评测!

作者:清秋https://juejin.cn/post/6943228944489381901今天主要是想通过和第六版的对比的形式来看看第七版犀牛书有什么变化。首先最大的变化就是书变薄了!从原来的 1000 多页缩到了不到 600 页,篇幅变小的原因书中也交代了,如今互…

java简单数据结构_java数据结构简单点

java常用的数据结构一 集合框架主要就是Collection和Map:1、Collection包含了List和Set两大分支。(1)List是一个有序的集合,每一个元素都有它的索引。第一个元素的索引值是0。List的实现类有ArrayList,LinkedList, Vector, Stack。(1)ArrayListArrayList…

阿里腾讯面试梳理个人成长经历分享

本文没有具体的题目,根据我的简历,来展开谈一谈,可能会被问到的题目。最后以下都是个人观点,个人能力有限,如果有错误,希望能纠正我。简单介绍2021届毕业生,掘金里面的TianTianUp,双…

「美团技术pdf」1300+页,覆盖前端、后台、顶会论文……

美团技术团队分享的文章,不管是在质量、深度、广度都走在前沿;小生受益匪浅,刚好美团分享过电子书,这里分享给大家!这本电子书内容覆盖前端、后台、算法、数据、运维、安全等多个领域, 希望对同学们的工作和…

微前端在美团外卖的实践

背景微前端是一种利用微件拆分来达到工程拆分治理的方案,可以解决工程膨胀、开发维护困难等问题。随着前端业务场景越来越复杂,微前端这个概念最近被提起得越来越多,业界也有很多团队开始探索实践并在业务中进行了落地。可以看到,…