对象的四种引用级别

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活地控制对象的生命周期。这四种级别分别是: [b]强引用[/b], [b]软引用[/b],[b]弱引用[/b]和[b]虚引用[/b]。

[b]1. 强引用[/b]
这是使用最普遍的引用。如果一个对象具有强引用,垃圾回收器就不会回收它。在内存不足的情况下,JVM宁愿抛出
[color=red]OutOfMemoryError[/color]错误,使程序异常终止,也不会强行回收具有强引用的对象所占用的空间!

[b]2. 软引用(SoftReference)[/b]
如果一个对象[b]只[/b]具有软引用, 那么只要内存空间足够,垃圾回收器就不会回收它,但如果内存空间不足了,就会坚定不移地回收这些具有软引用的对象所占用的空间。
因此,软引用可以用来实现 [color=blue]内存敏感的高速缓存[/color]。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JVM就会把这个[b]软引用[/b](是软引用本身,而不是之前具有软引用的对象)加入到与其关联的引用队列中。
---------------------
如果垃圾收集器发现了软引用对象,就会出现一下情况:
SoftReference对象的referent域被设置为null,使它不再引用堆对象。
SoftReference应用的堆对象被声明为 finalizable。
当堆对象的finalize()方法被执行且占用的内存被释放,SoftReference对象就被添加到它的ReferenceQueue中(如果后者存在的话)。


[b]3.弱引用(WeakReference)[/b]
如果一个对象[b]只[/b]具有弱引用,它就拥有了比软引用更短暂的生命周期。
在垃圾回收线程扫描它所管理的内存区域的过程中,一旦发现只具有弱引用的对象,不管当前内存空间是否足够,都会回收它! 但由于垃圾回收线程是一个优先级很低的线程,因此不一定很快就能发现那些只具有弱引用的对象。
弱引用也可以和一个引用队列联合使用,当弱引用的对象被垃圾回收,JVM就会把这个弱引用加入到与之关联的引用队列中。
弱引用的一个典型用途就是规范化映射(canonicalized mapping).另外,对于那些生存期相对较长,而且重新创建的开销也不高的对象来说,弱引用比较有用。
---------------------
如果垃圾收集器发现了弱引用对象,就会出现一下情况:
WeakReference对象的referent域被设置为null,使它不再引用堆对象。
WeakReference应用的堆对象被声明为 finalizable。
当堆对象的finalize()方法被执行且占用的内存被释放,WeakReference对象就被添加到它的ReferenceQueue中(如果后者存在的话)。


[b]4.虚引用(PhantomReference)[/b]
虚引用与前三种引用类型不同,它不会影响对象的生命周期,同时必须和引用队列联合使用。如果一个对象仅持有虚引用,那么这个对象就跟没有任何引用一样,随时可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的事件。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收,并在垃圾回收前采取必要的行动。
---------------------
如果垃圾收集器发现了虚引用对象,就会出现一下情况:
PhantomReference应用的堆对象被声明为 finalizable。
与软、弱引用不同,PhantomReference在堆对象被释放前就被添加到它的ReferenceQueue。这使您能够在堆对象被回收之前采取及时而有效的行动。


java.lang.ref包中提供了三个类:SoftReference类,WeakReference类和PhantomReference类,分别代表 软引用,弱引用,虚引用。 ReferenceQueue类表示引用队列,同前面三种 引用类 联合使用,以跟踪JVM垃圾回收的活动。


[code]//创建一个强引用
String str = new String("hello");
//创建引用队列,<String>为泛型标记,表明队列中存放String对象的引用
ReferenceQueue<String> rq = new ReferenceQueue<String>();
//创建一个弱引用,它引用前面的“hello”对象,并且与rq应用队列关联
WeakReference<String> wf = new WeakReference<String>(str,rq);[/code]

执行上述代码后,内存中[b]引用[/b]与[b]对象[/b]的关系如下图所示:
[img]http://www.javathinker.org/java/ref_1.gif[/img]

在图中,带实线的箭头表示强引用,带虚线的箭头表示弱引用。可以看到堆空间里面的
“hello”对象具有一个叫做str的强引用,还被WeakReference对象弱引用,因此
“hello”对象不会被垃圾回收。


下面的代码中,把强引用“hello”对象的str变量设置为null,然后再通过WeakReference的get()方法获得“hello”对象的弱引用:

[code]String str = new String("hello");
ReferenceQueue<String> rq = new ReferenceQueue<String>();
WeakReference<String> wf = new WeakReference<String>(str,rq);
str = null; //消除了“hello”对象的强引用
String str1 = wf.get();//如果“hello”对象在取消强引用str后还没被回收,则再次具有强引用str1
Reference<? extends String> ref = rq.poll();//如果“hello”对象没有被回收,rq.poll()返回null[/code]


执行完上面第四行代码后,“hello”对象只具有弱引用了,因此有被垃圾回收的可能。
假如它还没有来得及被回收(垃圾回收线程优先级比较低,恰好发生在4,5行之间的概率不是很高),接下来在第5行执行wf.get()方法会返回“hello”对象的引用,并使“hello”对象被str1强引用。接下来在第6行执行rq.poll()方法会返回
null,因为此时引用队列中没有任何引用。ReferenceQueue的poll()方法用于返回队列中的引用,如果没有则返回null。

[code]String str = new String("hello");
ReferenceQueue<String> rq = new ReferenceQueue<String>();
WeakReference<String> wf = new WeakReference<String>(str,rq);
str = null;
System.gc();//连续两次催促垃圾回收器工作,提高只有弱引用的“hello”对象被回收的可能性
System.gc();
String str1 = wf.get();//如果“hello”已经被回收,str1为null
Reference<? extends String> ref = rq.poll();[/code]
在上述代码中,执行完第四行后,“hello”对象仅仅具有弱引用。接着两次调用
System.gc()方法,催促垃圾回收器工作,从而提高“hello”对象被回收的可能性。
假如“hello”对象被回收,那么WeakReference对象的引用被加入到ReferenceQueue中,接下啦wf.get()方法返回null,并且rq.poll()方法返回WeakReference对象的引用。下图展示了执行完后,内存中引用与对象的关系:
[img]http://www.javathinker.org/java/ref_3.gif[/img]
PyMiMi实战指南:midas_api配置与连接测试详解 本文详细介绍了PyMiMi库中midas_api的配置与连接测试全流程。从环境准备、API密钥获取,到核心的url_cfg配置函数使用,再到通过test_url进行连接验证,提供了清晰的步骤和代码示例。文章重点解析了配置原理、常见错误排查方法(如401错误、连接超时),并强调了API密钥的安全性管理,帮助用户稳固建立Python与Midas Civil NX之间的自动化通信桥梁。 阅读详情

相关推荐

浅谈IC测试向量(pattern)及其转换

随着集成电路的飞速发展,其规模越来越大,对电路的质量与可靠性要求进一步提高,集成电路的测试方法也变得越来越困难,为了实现芯片的快速测试和筛选,ATE设备为其提供了强有力的支撑。ATE运用芯片设计仿真文件,将其作为芯片输入激励,通过ATE测试平台提供芯片测试环境,将芯片的输出和测试结果进行比较,以此来判定芯片的好坏。 说起IC测试,不得不说一下Pattern这个词,它中文的意思是模式。在图像处理中,这个词意思为图像的纹理特征,而在IC也即芯片测试行业,这个词实际上代表了需要测试芯片的时序特征。简单的说,在测

flomingo1的专栏 1万+

Java 2 引用类使用指南

Java 2 引用类使用指南  学习如何有效地使用 SoftReference、WeakReference 和 PhantomReference级别:初级Peter Haggar(haggar@us.ibm.com)高级软件工程师,IB...

weixin_34297704的博客 164

SCCM部署教程:(3)SCCM安装

这两则摘要介绍了WSUS和SCCM的安装步骤: WSUS安装:通过服务器管理器添加"Windows服务器更新服务"角色,选择SQL数据库并指定安装路径,验证数据库连接后完成安装。 SCCM安装:先运行预检工具Prereqchk.exe,选择主站点安装类型,配置语言、站点代码和名称,设置SQL数据库连接参数(保留默认端口4022),选择通信方法和系统角色(管理点和分发点),最后完成约1小时的安装过程。 两则安装指南都强调要确保数据库配置与前期准备一致,并提供了关键配置选项的说明。

小V锅的专栏 913

Java内存泄露的理解与解决

依赖于引用判断的内存管理机制 Java中对内存对象的访问,使用的是引用的方式。在Java代码中我们维护一个内存对象的引用变量,通过这个引用变量的值,我们可以访问到对应的内存地址中的内存对象空间。在Java程序中,这个引用变量本身既可以存放堆内存中,又可以放在代码栈的内存中(与基本数据类型相同)。GC线程会从代码栈中的引用变量开始跟踪,从而判定哪些内存是正在使用的。如果GC线程通过这种方式,无法跟...

weixin_34326429的博客 202

临床预测模型R语言全流程实战:从建模到Bootstrap验证的完整代码

临床预测模型是利用患者特征预测疾病结局发生概率的重要统计工具,其核心在于通过Logistic回归或Cox比例风险模型建立风险函数,并借助ROC曲线、校准曲线等指标评估模型的区分度与校准度。Bootstrap内部验证和DCA决策曲线分析则是当前审稿人关注的焦点,前者用于校正过拟合带来的乐观估计,后者用以判断模型在临床决策中的实际净获益。在肿瘤预后、慢病风险评估等场景中,基于R语言的模型构建与列线图可视化已成为论文发表的关键环节。本文以survival包自带肺癌数据为例,系统展示从数据预处理、变量筛选到多因素建

weixin_33483304的博客 243

相控阵雷达“相控”原理---多张动画示意图完美解释

很容易就能发现,相控阵雷达的天线由无数个小单元天线组成,这些小单元天线叫做“阵元”,对于有源相控阵雷达来说,每一个阵元都是独立控制的,它们既能独立发射雷达波,也能接收雷达波的回波信号。相控阵雷达可以在1秒内关机,1秒内开机,好处是,当军舰遇到依靠雷达信号进行引导的“反雷达导弹”时,可以迅速地把朝向来袭导弹方向的雷达关机,同时,其他方向的雷达保持开启。在过去,军舰上安装有不同种类的雷达,体积庞大、重不说,另一个麻烦是干扰,常常是,一种雷达工作时,另一种雷达就会受到干扰,严重的甚至不能同时工作。

muyangjun的专栏 1万+

Java中的几种引用方式

Java中的几种引用方式 Java中有几种不同的引用方式,它们分别是:强引用、软引用、弱引用和虚引用。下面,我们首先详细地了解下这几种引用方式的意义。 强引用 在此之前我们介绍的内容中所使用的引用 都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序...

安卡-java的专栏 271

指标异常检测和诊断

贡献度,即用定量衡量的方式来说明:一个指标YYY的异动△Y△Y△Y,具体是由其中哪些成分XiX_iXi​带来了多少异动△Yi△Y_i△Yi​?

qq_43349542的博客 3167

java判断实例不被引用_Java内存泄露分析,Java弱引用(weakreference)

在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期。从申请分配、到使用、再到最后的释放。这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记释放内存,从而导致内存的泄露。Java 语言对内存管理做了自己的优化,这就是垃圾回收机制。 Java的几乎所有内存对象都是在堆内存上分配(基本数据类型除外),然后由 GC ( garbagecollection)负责自动回...

weixin_42315706的博客 312

HALCON基于描述符的模板匹配(未标定)

HALCON基于不标定描述符的模板匹配

king_linj的博客 890

NVIDIA Isaac GR00T N1 人形机器人强化学习入门教程(二)详细步骤

LeRobot 格式 1.1 加载数据集 要加载数据集,我们需要定义以下 3 项内容: 在数据中显示图像帧 我们还可以对 LeRobotSingleDataset 类中的数据进行一系列转换。下面展示了如何对数据进行转换。 现在看看应用转换后的数据有何不同。 例如,对状态和操作进行规范化和串联,对视频图像进行裁剪、调整大小和颜色抖动。 二、GR00T 推断 本教程介绍如何使用 GR00

2506_90492529的博客 3012

Java 中对象的引用的四种级别

Java 中对象的引用的四种级别

coding 5228

成功解决raise Py4JError py4j.protocol.Py4JError: py4j.protocol.Py4JError: Could not find py4j jar at 

成功解决raise Py4JError("Could not find py4j jar at {0}".format(jarpath)) py4j.protocol.Py4JError: Could not find py4j jar at 目录 解决问题 解决思路 解决方法 1、第一步安装jdk 2、第二步安装或升级py4j 解决问题 raise Py4JError("Could not find py4j jar at {0...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 4627

android的四种对象引用级别:强、弱、软、虚引用

android中的强引用,弱引用,软引用,虚引用。代表了android中的对象引用级别,也即代表了java的垃圾回收机制,看可以简单理解为内存释放。 1、强引用:强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 2、如果一

zhao305585的专栏 2070

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java对象的四种引用级别

为了使程序能更加灵活地控制对象的生命周期从JDK1.2版本开始,JDK 把对象的引用级别分为了以下四种。由高到低:强引用→软引用→弱引用→虚引用。

weixin_43522117的博客 197

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

对象的引用的四种级别以及serializable作用和实现

1.强引用 以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用, 那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿 抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 2.软引用(SoftReference) 如果一个对象只具有软引用,那就类似于可有可物

nkdwslsd的专栏 417

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java中的四种引用类型

Java中四种引用类型

njitzyd 4071

Java对象引用级别(强引用、软引用、弱引用、虚引用)

强引用是我们最常见的对象,它属于不可回收资源,垃圾回收器(后面简称G C)绝对不会回收它,即使是内存不足,J V M宁愿抛出 OutOfMemoryErrorM 异常,使程序终止,也不会来回收强引用对象。

m0_46638350的博客 570

java中的四种引用:强弱软虚以及其用到的场景

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 1 . 强引用(StrongReference) 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对...

倚栏静望的博客 878

java对象的引用的4个级别

           从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。   1.强引用 本章前文介绍的引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemory...

iteye_7682的博客 123

Java的四种引用

从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 1.强引用 本章前文介绍的引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异

小罗的专栏 790

Java的强引用,软引用,弱引用,虚引用及其使用场景

从 JDK1.2 版本开始,Java 把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 1、强引用(Strong Reference) 强引用就是我们经常使用的引用,其写法如下: Object o = new Object(); 只要还有强引用指向一个对象,垃圾收集器就不会回收这个对象;显式地设置 o 为 nu...

关启培的博客 1174
上一篇: 错误的堆大小
下一篇: 正确使用引用类
spring8314
博客等级 码龄19年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值