【JVM从小白学成大佬】3.深入解析强引用、软引用、弱引用、幻象引用

  • 时间:
  • 浏览:10
  • 来源:大发快3_快3安卓app下载_大发快3安卓app下载

关于强引用、软引用、弱引用、幻象引用的区别,在好多好多 有公司的面试题中时不时出现,否则一点小伙伴随便说说一点知识点比较冷门,但随便说说亲们儿在开发中时不时用到,如new一个 对象的完后 好多好多 我强引用的应用。

在java语言中,除了原始数据类型(boolean、byte、short、char、int、float、double、long)的变量,一点所有全是所谓的引用类型,指向各种不同的对象。理解那先 引用的区别,对于掌握java对象生命周期和JVM内部管理相关机制非常有帮助。全是能够更深刻的理解底层对象生命周期、垃圾下发机制等,对设计可靠的缓存框架、诊断应用OOM等现象也大有裨益。

这有一种应用主要的区别体现在对象不同的可达性状态和对垃圾下发的影响,亲们之间的可达性状态都还还后能 参看下图:

1.强引用(strong reference)

强引用好多好多 我亲们儿最常见的普通对象引用(如new 一个 对象),若果还有强引用指向一个 对象,就表明此对象还“活着”。在强引用面前,即使JVM内存空间过低,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),让线程池池异常终止,好多好多 我会靠回收强引用对象来外理内存过低的现象。对于一个 普通的对象,否则越来越一点的引用关系,若果超过了引用的作用域否则显式地将相应(强)引用赋值为null,就是因为此对象都还还后能 被垃圾下发了。但要注意的是,并全是赋值为null后就立马被垃圾回收,具体的回收时机还是要看垃圾下发策略的。

如Object obj = new Object();

2.软引用(soft reference)

软引用相对强引用要弱化一点,都还还后能 让对象豁免一点垃圾下发。当内存空间足够的完后 ,垃圾回收器过多回收它。必须当JVM认定内存空间过低时才会去回收软引用指向的对象。JVM会确保在抛出OOM前清理软引用指向的对象,否则JVM是很聪明的,会尽否则优先回收长时间闲置过多的软引用指向的对象,对那先 刚构建的或刚使用过的软引用指向的对象尽否则的保留。基于软引用的那先 行态,软引用都还还后能 用来实现好多好多 有内存敏感点的缓存场景,即否则内存还有空闲,都还还后能 暂时缓存一点业务场景所需的数据,当内存过低时就都还还后能 清理掉,等上方再还要时,都还还后能 重新获取并再次缓存。好多好多 我 就确保在使用缓存提升性能的一齐,过多是因为耗尽内存。

软引用通常都还还后能 和一个 引用队列(ReferenceQueue)联合使用,否则弱引用所引用的对象被垃圾回收,java虚拟机就会把一点软引用加入到与之关联的引用队列中。

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
//有完后

会返回null
sf.get(); 

通过上方的代码都还还后能 看出sf是对obj的一个 软引用,当sf对象还越来越被销毁前,sf.get()都还还后能 获取到一点对象,否则已被销毁,则返回null。

正确使用软引用的示例代码如下:

SoftReference<List<Foo>> ref = new SoftReference<List<Foo>>(new LinkedList<Foo>());
 
// somewhere else in your code, you create a Foo that you want to add to the list
List<Foo> list = ref.get();
if (list != null)
{
    list.add(foo);
}
else
{
    // list is gone; do whatever is appropriate
} 

在使用软引用的完后 还要检查引用算不算为null。否则垃圾下发器否则在任意时刻回收软引用,否则不做算不算null的判断,否则会出现NullPointerException的异常。

总的来说,软引用是用来描述一点还有用但暂且必需的对象。对于软引用关联着的对象,在系统将要地处内存溢出异常完后 ,否则把那先 对象列进回收范围之中进行第二次回收。否则这次回收还越来越足够的内存,才会抛出内存溢出异常。

3.弱引用(weak reference)

弱引用指向的对象是有一种十分临近finalize状态的状态,当弱引用被清除的完后 ,就符合finalize的条件了。弱引用与软引用最大的区别好多好多 我弱引用比软引用的生命周期更短暂。垃圾回收器会扫描它所管辖的内存区域的过程中,若果发现弱引用的对象,不管内存空间算不算有空闲,全是立刻回收它。如同前面你爱不爱我过的,具体的回收时机还是要看垃圾回收策略的,否则那先 弱引用的对象并全是说若果达到弱引用状态就会立马被回收。

基于弱引用的那先 行态,弱引用同样都还还后能 应用在好多好多 有还要缓存的场景。

Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
//有完后

会返回null
wf.get();
//返回算不算被垃圾回收器标记为即将回收的垃圾
wf.isEnQueued();

4.幻象引用(phantom reference)

幻象引用,全是被说成是虚引用或烈焰引用。幻象引用暂且会决定对象的生命周期。即否则一个 对象仅持有虚引用,就合适越来越任何引用一样,在任何完后 都否则被垃圾回收器回收。必须通过它访问对象,幻象引用仅仅是提供了有一种确保对象被finalize完后 ,做一点事情的机制(如做所谓的Post-Mortem清理机制),全是人利用幻象引用监控对象的创建和销毁。

Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
//永远返回null
pf.get();
//返回算不算从内存中否则删除
pf.isEnQueued(); 

幻象引用的get辦法 永远返回null,主要用于检查对象算不算否则从内存中删除。

5.生存还是死亡

通过上方对有一种引用类型的分析,你否则发现一点对象即使不可达,但也暂且是“非死不可”的,一点完后 它们暂时地处“缓刑”阶段,要真正提前大选一个 对象死亡,合适要经历两次标记过程否则对象在进行可达性分析后发现越来越与GC Roots相连接的引用链,那它否则被第一次标记否则进行一次筛选,筛选的条件是此对象算不算有必要执行finalize()辦法 。当对象越来越覆盖finalize()辦法 ,否则finalize()辦法 否则被虚拟机调用过,虚拟机将这有一种状态都视为“越来越必要执行”。

否则一点对象被判定为有必要执行finalize()辦法 ,越来越一点对象否则放置在一个 叫做F-Queue的队列之中,并在稍后被一个 由虚拟机自动建立的、低优先级的Finalizer线程池池去执行它。这里所谓的“执行”是指虚拟否则触发一点辦法 ,但暂且承诺会在等待它运行开使英文,好多好多 我 做的是因为是,否则一个 对象在finalize()辦法 中执行缓慢,否则地处了死循环(更极端的状态),将很否则会是因为F-Queue队列中一点对象永久地地处等待,甚至是因为整个内存回收系统奔溃。finalize()辦法 是对象逃脱死亡命运的最后一次否则,稍后GC将对F-Queue中的对象进行第二次小规模的标记,否则对象要在finalize()中成功拯救当事人——若果重新与引用链上的任何一个 对象建立关联即可。譬如把当事人(this关键字)赋值给某个类变量否则对象的成员变量,那在第二次标记时它将被移除出“即将回收”的集合;否则对象这完后 还越来越逃脱,那基本上它就真的被回收了。

任何一个 对象的finalize()辦法 都只会被系统自动调用一次,否则对象面临下一次回收,它的finalize()辦法 过多被再次执行。

6.总结

对象的可达性是JVM垃圾下发器决定如保外理对象的一个 重要考虑指标

所有引用类型全是抽象类java.lang.ref.Reference的子类,子类里提供了get()辦法 。通过上方的分析中都还还后能 得知,除了幻象引用(否则get永远返回null),否则对象还越来越被销毁,都都还还后能 通过get辦法 获取原有对象。随便说说有个非常关键的注意点,利用软引用和弱引用,亲们儿都还还后能 将访问到的对象,重新指向强引用,也好多好多 我人为的改变了对象的可达性状态。好多好多 有对于软引用、弱引用类似于于,垃圾下发器否则会地处二次确认的现象,以确保地处弱引用状态的对象越来越改变为强引用。

否则有个现象,否则亲们儿错误的保持了强引用(比如,赋值给了static变量),越来越对象否则就越来越否则变回类似于于弱引用的可达性状态了,就会产生内存泄露。好多好多 有,检查弱引用指向对象算不算被垃圾下发,也是诊断算不算有特定内存泄露的一个 思路,亲们儿的框架使用到弱引用又怀疑有内存泄露,就都还还后能 从一点淬硬层 检查。

对于软引用、弱引用、幻象引用都还还后能 配合引用队列(ReferenceQueue)来使用,一阵一阵是幻象引用,get辦法 只返回null,否则再不指定引用队列,基本就越来越任何意义了。

上方分析了有一种引用类型的使用,熟悉这几种应用类型对深入理解JVM也大有裨益。

热门阅读:

【JVM从小白学成大佬】1.开篇【JVM从小白学成大佬】2.Java虚拟机运行时数据区

参考

《深入理解Java虚拟机》

http://www.kdgregory.com/index.php?page=java.refobj

猜你喜欢

TechWeb.com.cn

创始人被刑拘、多名高管被带走、公司被证监会立案调查、业绩大幅下滑……恺英网络正在遭遇“多事之秋”。先是7nm产能供不应求,5nm产能也被预定了,现在就连前两代的工艺也面临缺货了

2019-10-15

L. Buchanan数据,L. Buchanan新闻,L. Buchanan视频,L. Buchanan身价

首页新闻视频直播数据APP懂球号广告商务媒体合作L.BuchananL.Buchanan俱乐部:德比郡国籍:英格兰身高:175CM位置:后卫年龄:18岁体重:67KG号码:48

2019-10-14

政商界斥美損港利益 助長暴力

【大公報訊】針對美國國會參眾兩院外委會通過所謂「2019年香港人權與民主法案」,香港多個政團紛紛表示譴責,斥責美方此舉粗暴干涉香港事務,嚴重踐踏國際法和國際關係基本準則,不惜損

2019-10-14

瑞幸咖啡回应亏损超8亿:前期亏损符合预期,已提前完成年度目标

图片版权所属:站长之家站长之家(ChinaZ.com)12月27日消息:早期大额补贴抢占市场对于互联网创业公司来说是再寻常不过的事情。然而,从小黄车目前的情况表来看,另一个人对

2019-10-14

AerNos发布新一代物联网应用纳米气体传感器

站长之家(ChinaZ.com)12月25日消息:据媒体报道,近日,纳米固体传感器创新厂商AerNos发布了新一代纳米固体传感器技术AerN2S。AerN2S突破了核心技术,都

2019-10-14