java 几种引用类型_Java 四种引用类型总结-Fun言

1. Java引用介绍

Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:

强引用  >  软引用  >  弱引用  >  虚引用

⑴ 强引用(Strong Reference)

强引用是使用最普遍的引用,也是赋值的默认引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

⑵ 软引用(Soft Reference)

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。

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

⑶ 弱引用(Weak Reference)

弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

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

⑷ 虚引用(Phantom Reference)

“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

四种引用回收情景

级别

什么时候被垃圾回收

用途

生存时间

强引用

从来不会

对象的一般状态

JVM停止运行时终止

软引用

在内存不足时

对象简单?缓存

内存不足时终止

弱引用

在垃圾回收时

对象缓存

gc运行后终止

虚引用

Unknown

Unknown

Unknown

Java 4 种引用使用场景

StrongReference、 SoftReference、 WeakReference、PhantomReference (传说中的幽灵引用)

这 4 种类型的引用与 GC 有着密切的关系, 下面逐一来看它们的定义和使用场景 :

1. Strong Reference

StrongReference 是 Java 的默认引用实现,  它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收

@Test

public void strongReference() {

Object referent = new Object();

/**

* 通过赋值创建 StrongReference

*/

Object strongReference = referent;

assertSame(referent, strongReference);

referent = null;

System.gc();

/**

* StrongReference 在 GC 后不会被回收

*/

assertNotNull(strongReference);

}

2. WeakReference & WeakHashMap

WeakReference,是一个弱引用,  当所引用的对象在 JVM 内不再有强引用时, GC 后 weak reference 将会被自动回收

@Test

public void weakReference() {

Object referent = new Object();

WeakReference weakRerference = new WeakReference(referent);

assertSame(referent, weakRerference.get());

referent = null;

System.gc();

/**

* 一旦没有指向 referent 的强引用, weak reference 在 GC 后会被自动回收

*/

assertNull(weakRerference.get());

}

WeakHashMap 使用 WeakReference 作为 key

一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry

@Test

public void weakHashMap() throws InterruptedException {

Map weakHashMap = new WeakHashMap();

Object key = new Object();

Object value = new Object();

weakHashMap.put(key, value);

assertTrue(weakHashMap.containsValue(value));

key = null;

System.gc();

/**

* 等待无效 entries 进入 ReferenceQueue 以便下一次调用 getTable 时被清理

*/

Thread.sleep(1000);

/**

* 一旦没有指向 key 的强引用, WeakHashMap 在 GC 后将自动删除相关的 entry

*/

assertFalse(weakHashMap.containsValue(value));

}

3. SoftReference

SoftReference 于 WeakReference 的特性基本一致, 最大的区别在于 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存应用

@Test

public void softReference() {

Object referent = new Object();

SoftReference softRerference = new SoftReference(referent);

assertNotNull(softRerference.get());

referent = null;

System.gc();

/**

*  soft references 只有在 jvm OutOfMemory 之前才会被回收, 所以它非常适合缓存应用

*/

assertNotNull(softRerference.get());

}

参考推荐:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS运算符类型

一、运算符类型 1、算术运算符&#xff1a;用于各类数值运算&#xff0c;包括加()、减(-)、乘(*)、除(/)、求余(或称模运算&#xff0c;%)、自增()、自减(--)共七种。2、关系运算符&#xff1a;用于比较运算。包括大于&#xff08;>&#xff09;、小于&#xff08;<&…

python关于字符串的内置函数_Python 字符串内置函数(二)

# 2.格式化相关# ljust(width) 函数 获取固定长度&#xff0c;左对齐&#xff0c;右边不够用空格补齐# rjust(width) 函数 获取固定长度&#xff0c;右对齐&#xff0c;左边不够用空格补齐# center(width) 函数 获取固定长度&#xff0c;中间对齐&#xff0c;两边不够用空格补齐…

边缘计算4.0正急速驶来,你做好准备了吗?

物联网智库 整理发布导 读近十年间&#xff0c;各行各业的企业都经历着数字化技术和产品对传统生产经营模式的冲击。人工智能、大数据、区块链、自动化等技术的日渐完善&#xff0c;让企业的生产效率和业务模式发生了翻天覆地的变化。

java中for的常规用法_Java for循环的几种用法详解

本文非常适合初学Java的程序员&#xff0c;主要是来了解一下Java中的几种for循环用法&#xff0c;分析得十分详细&#xff0c;一起来看看。J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环&#xff0c;可以用更简单地方式来遍历数组和Collection等类型的对象。本文介…

运维-替换-修改kibana徽标

作为一名纯运维人员&#xff0c;想更改kibana的徽标。 并不能像开发一样去看源码并修改源码。 所以我们可以替换徽标。 先来一个效果图。我的版本是5.5.1。 具体的修改过程&#xff1a; 在kibana安装路径下面。 optimize/bundles/ 0cebf3d61338c454670b1c5bdf5d6d8d.svg 这…

python中的变量的作用_Python中的变量作用域

python中变量作用域包括&#xff1a;L (Local) 局部作用域&#xff0c;函数内部声明但没有使用global的变量E (Enclosing) 闭包函数外的函数中&#xff0c;def或者lambda的本地作用域G (Global) 全局作用域&#xff0c;函数中使用global声明的变量或在模块层声明的变量B (Built…

欧拉公式——真正的宇宙第一公式

来源&#xff1a;数学中国欧拉公式是数学里最令人着迷的公式之一&#xff0c;它将数学里最重要的几个常数联系到了一起&#xff1a;两个超越数&#xff1a;自然对数的底e&#xff0c;圆周率π&#xff1b;两个单位&#xff1a;虚数单位i和自然数的单位1&#xff0c;以及数学里常…

SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件

我们这一一篇博客讲的是如何整合Springboot和Mybatis框架&#xff0c;然后使用generator自动生成mapper&#xff0c;pojo等文件。然后再使用阿里巴巴提供的开源连接池druid&#xff0c;这个连接池的好处我就不说了&#xff0c;集合了所有连接池的好处&#xff0c;并且还提供了监…

python提取部分字符串三参数_python3 字符串属性(三)

maketrans 和 translate的用法(配合使用)下面是python的英文用法解释maketrans(x, yNone, zNone, /)Return a translation table usable for str.translate().If there is only one argument, it must be a dictionary mapping Unicodeordinals (integers) or characters to Un…

java实现qq抢红包_Java实现抢红包功用

用多线程模仿多人一起抢红包。服务端将玩家发出的红包保存在一个行列里&#xff0c;然后用Job守时将红包信息推送给玩家。每一批玩家的抢红包恳求&#xff0c;其实操作的都是从行列中弹出的第一个红包元素&#xff0c;但当时的红包数量为空的时分&#xff0c;主动弹出下一个红包…

芯片里面100多亿个晶体管是如何安装上去的?

来源&#xff1a;金属加工如今随着芯片制程的不断提升&#xff0c;芯片中可以有100多亿个晶体管&#xff0c;如此之多的晶体管&#xff0c;究竟是如何安上去的呢&#xff1f;1当芯片被不停地放大&#xff0c;里面宛如一座巨大的城市。这是一个Top-down View 的SEM照片&#xff…

[CEOI2008] order

题目描述 有N个工作&#xff0c;M种机器&#xff0c;每种机器你可以租或者买过来. 每个工作包括若干道工序&#xff0c;每道工序需要某种机器来完成,你可以通过购买或租用机器来完成。 现在给出这些参数&#xff0c;求最大利润 输入输出格式 输入格式&#xff1a; 第一行给出 N…

response.end后抛了异常_(七)异常处理

(七)异常处理异常异常的体系结构java.lang.Throwable|-----java.lang.Error&#xff1a;一般不便携针对性的代码进行处理|-----java.lang.Exception&#xff1a;可以进行异常的处理|-----编译时异常&#xff08;checked|-----IOException|-----FileNotFoundException|-----Clas…

java xy x y_为什么该语句在Java中不起作用x ^ = y ^ = x ^ = y;

小编典典您的陈述大致相当于这种扩展形式&#xff1a;x x ^ (y y ^ (x x ^ y));与C语言不同&#xff0c;在Java中&#xff0c;保证二进制运算符的左操作数在右操作数之前进行求值。评估如下&#xff1a;x x ^ (y y ^ (x x ^ y))x 1 ^ (y 2 ^ (x 1 ^ 2))x 1 ^ (y 2 ^…

AI+视频分析:实时监测无处不在的安全风险

来源丨Forbes作者丨Louis Columbus编译丨科技行者纵观2020年运营层面的诸多挑战&#xff0c;公共事业企业已经意识到对其所运营的物理及网络安全体系进行360度全方位审视的重要意义。最近&#xff0c;由Gartner发布的调查报告显示&#xff0c;94%的北美CIO认为&#xff0c;对偏…

大数据第一期

一 、大数据的技术体系 有几个部分组成&#xff1a; 六层 数据可视化 &#xff08;Cboard &#xff0c; Echart&#xff09; 五层 数据分析&#xff08;数据仓库&#xff08;Hive&#xff09;&#xff0c;数据挖掘&#xff08;SparkStreming&#xff09;&#xff0c;OLAP&…

python 绘图的背景颜色不要_matplotlib自定义添加 “哆啦A梦”背景图,这个操作真牛逼!...

为什么需要加星标&#xff1f;由于微信公众号出现了 “乱序” 排列的状况&#xff0c;也就是说&#xff1a;文章不会按照 “时间顺序” 推送给你。那么朋友们就不能第一时间&#xff0c;收到我的干货。因此希望您抽出一分钟&#xff0c;完成如下三步。数据分析与统计学之美原创…

台积电2nm工艺重大突破!

来源&#xff1a;万物智能视界根据最新报道&#xff0c;台积电已经在2nm工艺上取得一项重大的内部突破&#xff0c;虽未披露细节&#xff0c;但是据此乐观预计&#xff0c;2nm工艺有望在2023年下半年进行风险性试产&#xff0c;2024年就能步入量产阶段。台积电还表示&#xff0…

png文件合并_png格式图片和jpg格式图片有什么区别?

两个格式的图片群文件有一定的相似之处&#xff0c;png是无损压缩&#xff0c;可以在PS中重新编辑。.jpg格式是一种压缩的图片文件&#xff0c;不能再次编辑&#xff0c;而且在解析度上也是不如.png格式。具体介绍如下&#xff1a;1、png是无损压缩&#xff0c;png即可移植网络…

sql 列集合

STUFF((SELECT ,CAST( TYZ_Bh as varchar(10)) FROM #1 where 片区划分江东 for xml path()),1,1,) 转载于:https://www.cnblogs.com/kunlunmountain/p/8796499.html