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

  • 时间:
  • 浏览:0
  • 来源:大发时时彩_时时彩最新版下载_大发时时彩最新版下载

关于强引用、软引用、弱引用、幻象引用的区别,在以后 公司的面试题中经常经常出显,可能这名 小伙伴人太好这名 知识点比较冷门,但人太好我们 歌词 在开发中经常用到,如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