一文讲透java弱引用以及使用场景 布满荆棘的人生 2024-04-01 09:02 34阅读 0赞 #### 文章目录 #### * 概念 * 深入原理 * 参考 ## 概念 ## 大部分情况下我们看到是强引用,比如下面这一行: String str1 = new String("abc"); 变量str1被用来存放一个string对象的强引用上。强引用在你正在使用时这个对象时,一般是不会被垃圾回收器回收的。当出现内存空间不足时,虚拟机不会释放强引用的对象占用的空间,而是选择抛出异常(OOM)。 什么时候会回收强引用的空间呢,就是没有引用的时候,比如你这样写: str1 = null GC在适当的时候就会回收str1指向的空间。 而弱引用(Weak Reference)的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的时,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。 java中使用弱引用的语法是: String str1 = new String("abc"); WeakReference<String> weakReference = new WeakReference<>(str1); ## 深入原理 ## 我们先来通过一个案例,看下gc对于弱引用的回收策略。 import java.lang.ref.WeakReference; public class WeakReferenceTest { public static WeakReference<String> weakReference1; public static WeakReference<String> weakReference2; public static void main(String[] args) { test1(); //test1外部,hello对象作用域结束,没有强引用指向"value"了。只有一个弱引用指向"value" System.out.println("未进行gc时,只有弱引用指向value内存区域 weakReference1:" + weakReference1.get()); //此时gc时会回收弱引用 System.gc(); //此时输出都为nuill System.out.println("进行gc时,只有弱引用指向value内存区域 weakReference1:" + weakReference1.get()); } public static void test1() { //hello对象强引用"value" String hello = new String("value"); //weakReference1对象弱引用指向"value" weakReference1 = new WeakReference<>(hello); weakReference2= new WeakReference<>(new String("value2")); //在test1内部调用gc,此时gc不会回收弱引用,因为hello对象强引用"value" System.gc(); System.out.println("进行gc时,强引用与弱引用同时指向value内存区域 weakReference1:" + weakReference1.get()); System.out.println("进行gc时,强引用与弱引用同时指向value内存区域 weakReference2:" + weakReference2.get()); } 运行的结果: 进行gc时,强引用与弱引用同时指向value内存区域 weakReference1:value 进行gc时,强引用与弱引用同时指向value内存区域 weakReference2:null 未进行gc时,只有弱引用指向value内存区域 weakReference1:value 进行gc时,只有弱引用指向value内存区域 weakReference1:null 这里有个前置知识说下,当要获得WeakReference的object时, 首先需要判断它是否已经被GC回收,若被收回,则下列返回值为空: weakReference1.get(); 根据这个结果,我们可以得出这样的结论: * 当有强引用指向value内存区域时,即使进行gc,弱引用也不会被释放,对象空间不回被回收。 test1()方法内,虽然执行了gc,但是String hello变量 和weakReference1都指向 new String(“value”);对象,特别是String hello变量是局部变量,当 test1()执行完后才会销毁,此时尚未销毁,那么没有必要回收weakReference1,为什么? 答案很简单,我们的若引用初衷是断开弱引用,让gc时 root发现 new String(“value”);是光杆司令,符合回收条件,当String hello变量仍然存在时,并不符合光杆司令,那么此时若断开,也无效,反而不如啥也不干! 如果改造为:`weakReference1 = new WeakReference<>( new String("value"));` 就能立即生效,因为只有weakReference2唯一引用新建的string对象 * 当无强引用指向value内存区域是,进行gc,弱引用会被释放,对象空间将会执行回收流程。 ## 参考 ## [一文讲透java弱引用以及使用场景][java] [java]: https://blog.csdn.net/pony_maggie/article/details/124597982
相关 理解Java中的弱引用:使用场景、问题以及解决策略 在Java中,弱引用(Soft Reference)是一种特殊类型的引用,它不会增加目标对象的垃圾收集权重。简单来说,即使你的对象被所有强引用都抛弃了,只要还有弱引用指向它,那 布满荆棘的人生/ 2024年09月11日 12:15/ 0 赞/ 32 阅读
相关 Java-接口(一篇讲透) 接口(interface)前言一、引入二、理解三、使用四、应用:代理模式(Proxy)1. 应用场景2. 分类3. 代码演示五、接口和抽象类之间的对比六、经典题目(排错)... 一时失言乱红尘/ 2024年04月28日 08:11/ 0 赞/ 28 阅读
相关 一文讲透java弱引用以及使用场景 文章目录 概念 深入原理 参考 概念 大部分情况下我们看到是强引用,比如下面这一行: String str1 = new String 布满荆棘的人生/ 2024年04月01日 09:02/ 0 赞/ 35 阅读
相关 一文讲透Netty核心源码 1. Netty是什么 Netty是 一个异步的,事件驱动的网络应用程序框架,基于Java Nio的Api实现 ... > 定义较长,看完估计 懂的人感觉没营养,不懂的 末蓝、/ 2023年10月04日 23:18/ 0 赞/ 9 阅读
相关 一文讲透 Redis 事务【详情版】 [ ][Link 1] ![3e73a34e0dddfe51ced695183ff16deb.png][] 准确的讲,Redis 事务包含两种模式 : 事务模式 和 Lua 深藏阁楼爱情的钟/ 2023年09月26日 21:32/ 0 赞/ 25 阅读
相关 一文讲透aPaaS平台是什么 点击上方“程序猿技术大咖”,关注加群讨论 作者丨明道协作 来源丨https://www.sohu.com/a/320899243\_120054262 互联网行业就喜欢搞 今天药忘吃喽~/ 2022年12月11日 03:17/ 0 赞/ 177 阅读
相关 spring源码解析---一文讲透@Configuration ![file][] > 这是一篇长文,但是很自信的是我相信我讲的已经非常透彻了,想必你读完之后,一定对@Configuration有一个很透彻的理解。 @Configura 不念不忘少年蓝@/ 2022年12月04日 07:38/ 0 赞/ 151 阅读
相关 一文讲透计算机的“中断” 投稿人:Rand 公众号:Rand\_cs 中断,英文名为Interrupt,计算机的世界里处处都有中断,任何工作都离不开中断,可以说整个计算机系统就是由中断来驱动的。那么 妖狐艹你老母/ 2022年11月12日 05:24/ 0 赞/ 151 阅读
相关 一文讲透APaaS平台是什么 关注「开源Linux」,选择“设为星标” 回复「学习」,有我为您特别筛选的学习资料~ 互联网行业就喜欢搞一些单词的缩写,在云计算行业,前者有SaaS、PaaS、Iaa 秒速五厘米/ 2021年07月26日 13:13/ 0 赞/ 469 阅读
还没有评论,来说两句吧...