博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中的强引用,软引用,弱引用
阅读量:4963 次
发布时间:2019-06-12

本文共 1842 字,大约阅读时间需要 6 分钟。

作者:winterSunshine
链接:https://www.zhihu.com/question/37401125/answer/100981172
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1.概念解释
    • 强引用是使用最普遍的引用:Object o=new Object(); 特点:不会被GC
      • 将对象的引用显示地置为null:o=null; // 帮助垃圾收集器回收此对象
      • 举例ArrayList的实现源代码:<img src="https://pic2.zhimg.com/50/dd6f826c4e0c045f3701978f311636e1_hd.png" data-rawwidth="361" data-rawheight="159" class="content_image" width="361">
    • 软引用用来描述一些还有用但是并非必须的对象,在Java中用java.lang.ref.SoftReference类来表示。对于软引用关联着的对象,只有在内存不足的时候JVM才会回收该对象。因此,这一点可以很好地用来解决OOM的问题,并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。
      1. 浏览器网页缓存实例:
        <img src="https://pic4.zhimg.com/50/34a44802709c83869b50c5e16b8256db_hd.png" data-rawwidth="738" data-rawheight="143" class="origin_image zh-lightbox-thumb" width="738" data-original="https://pic4.zhimg.com/34a44802709c83869b50c5e16b8256db_r.png">
      2. 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
  • 弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
如果这个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象。
  1. 实例:<img src="https://pic4.zhimg.com/50/5000607cf6d43abd0533624cadea18bb_hd.png" data-rawwidth="743" data-rawheight="463" class="origin_image zh-lightbox-thumb" width="743" data-original="https://pic4.zhimg.com/5000607cf6d43abd0533624cadea18bb_r.png">
  • 虚引用也称为幻影引用:一个对象是都有虚引用的存在都不会对生存时间都构成影响,也无法通过虚引用来获取对一个对象的真实引用。唯一的用处:能在对象被GC时收到系统通知,JAVA中用PhantomReference来实现虚引用。
2.对比不同:
<img src="https://pic3.zhimg.com/50/65b7abe9bf2fcd249c789024d95bb67a_hd.jpg" data-rawwidth="858" data-rawheight="378" class="origin_image zh-lightbox-thumb" width="858" data-original="https://pic3.zhimg.com/65b7abe9bf2fcd249c789024d95bb67a_r.jpg">

转载于:https://www.cnblogs.com/kakaisgood/p/8022999.html

你可能感兴趣的文章
Httpservletrequest
查看>>
Jquery.ajax报parseerror Invalid JSON错误的原因和解决方法:不能解析
查看>>
杭电2602 Bone Collector
查看>>
数据库连接池的工作原理
查看>>
关于"××××程序集清单定义与程序集引用不匹配"问题的解决
查看>>
Unix和Linux的区别和联系
查看>>
计算机基础 python入门
查看>>
数据库那些事
查看>>
20150423 提问2
查看>>
Visual.Basic.NET项目开发实践pdf
查看>>
webservice远程测试显示 “测试窗体只能用于来自本地计算机的请求”
查看>>
DOM解析XML练习
查看>>
CF 118E Bertown roads 桥
查看>>
Combination Sum
查看>>
一个U盘黑掉你:TEENSY实战
查看>>
初涉斯坦纳树&&bzoj4774: 修路
查看>>
Unity 自定义编辑器窗口 画线
查看>>
使用spring框架中的组件发送邮件
查看>>
出现大量rcuob进程
查看>>
[JZOJ3296] 【SDOI2013】刺客信条
查看>>