热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java强软弱虚_JAVA:强、软、弱、虚引用的区别和使用

引用队列(ReferenceQueue)作用Queue的意义在于我们在外部可以对queue中的引用进行监控,当引用中的对象被回收后,我们可以对引用对象本

引用队列(ReferenceQueue)作用

Queue的意义在于我们在外部可以对queue中的引用进行监控,当引用中的对象被回收后,我们可以对引用对象本身继续做一些清理操作,因为我们引用对象(softRef)也占有一定的资源。

弱引用(WeakReference)

弱引用中的对象具有很短的声明周期,因为在系统GC时,只要发现弱引用,不管堆空间是否足够,都会将对象进行回收。由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

弱引用的简单使用:

Object obj = new Object();

WeakReference weakRef = new WeakReference(obj);

//删除强引用

obj = null;

System.out.println("gc之后的值:" + weakRef.get()); // 对象依然存在

//调用gc

System.gc();

System.out.println("gc之后的值:" + weakRef.get()); // 对象为null

弱引用也可以和一个引用队列联合使用,如果弱引用中的对象(obj)被回收,那么软引用会被 JVM 加入关联的引用队列中。

ReferenceQueue queue &#61; new ReferenceQueue<>();

Object obj &#61; new Object();

WeakReference weakRef &#61; new WeakReference(obj,queue);

//删除强引用

obj &#61; null;

System.out.println("gc之后的值: " &#43; weakRef.get()); // 对象依然存在

//调用gc

System.gc();

//如果obj被回收&#xff0c;则软引用会进入引用队列

Reference> reference &#61; queue.remove();

if (reference !&#61; null){

System.out.println("对象已被回收: "&#43; reference.get());  // 对象为null

}

软引用和弱引用都非常适合保存那些可有可无的缓存数据&#xff0c;当内存不足时&#xff0c;缓存数据被回收(再通过备选方案查询)&#xff0c;当内存充足时&#xff0c;也可以存在较长时间&#xff0c;起到加速的作用。

应用

WeakHashMap

当key只有弱引用时&#xff0c;GC发现后会自动清理键和值&#xff0c;作为简单的缓存表解决方案。

ThreadLocal

ThreadLocal.ThreadLocalMap.Entry 继承了弱引用&#xff0c;key为当前线程实例&#xff0c;和WeakHashMap基本相同。

虚引用(PhantomReference)

虚引用 就是 形同虚设 &#xff0c;它并不能决定 对象的生命周期。任何时候这个只有虚引用的对象都有可能被回收。因此&#xff0c;虚引用主要用来跟踪对象的回收&#xff0c;清理被销毁对象的相关资源。PhantomReference的 get() 方法永远返回null &#xff0c;而且只提供了与引用队列同用的构造函数。所以虚引用必须和引用队列一同使用。

Map map &#61; new HashMap<>();

ReferenceQueue queue &#61; new ReferenceQueue<>();

Object obj &#61; new Object();

PhantomReference phantomRef &#61; new PhantomReference(obj,queue);

map.put(obj,"obj val");

new CheckRefQueue(queue,map).start();

//删除强引用

obj &#61; null;

Thread.sleep(1000);

int i &#61; 1;

while (true){

System.out.println("第"&#43;i&#43;"次gc");

System.gc();

Thread.sleep(1000);

}

public class CheckRefQueue extends Thread {

private ReferenceQueue queue;

private Map map;

public CheckRefQueue(ReferenceQueue queue, Map map) {

this.queue &#61; queue;

this.map &#61; map;

}

&#64;Override

public void run() {

// 等待&#xff0c;直到对象呗回收

Reference reference &#61; queue.remove();

// 释放引用对象的引用

map.remove(reference.get());

}

}

总结

e7cab0177a3e57b203af09de5df24fdc.png

reference-level.png

作者&#xff1a;码上实战

链接&#xff1a;https://www.jianshu.com/p/ee4363989022

来源&#xff1a;简书

著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • BZOJ1233 干草堆单调队列优化DP
    本文介绍了一个关于干草堆摆放的问题,通过使用单调队列来优化DP算法,求解最多可以叠几层干草堆。具体的解题思路和转移方程在文章中进行了详细说明,并给出了相应的代码示例。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
author-avatar
嘻嘻嘻嘻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有