[ Java ] 超级大白话解释 —— 强引用弱引用软引用虚引用(59.99秒懂)
Posted 削尖的螺丝刀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ Java ] 超级大白话解释 —— 强引用弱引用软引用虚引用(59.99秒懂)相关的知识,希望对你有一定的参考价值。
前言: 万能的程序猿可以指定哪些不是垃圾不能被回收,哪些是普通的垃圾可以晚点回收,哪些是超级垃圾需立马被回收…
[ 强引用 ]
解释: 我们日常用 “=” 号 直接赋值的对象大都属于强引用,它被认为是必须
用到的对象,哪怕是抛出OOM,GC也不会回收。
( 如何中断强引用? 直接赋值为 null 即可,这时GC会认为对象无引用,可直接回收 )
[ 软引用 ]
注意弱引用、软引用、虚引用和强引用的直接区别就是对象都要被一个
Reference类
包裹。
举例:
SoftReference sr = new SoftReference<String>(new String("hello"));
解释: 被标为软引用的对象被认为是有用但不一定需要立马被回收
的对象,在发生GC时除非内存不够才会被回收,否则不会。
用例: 做一些小的缓存,比如网页浏览的上一页内容缓存进去,如果有人请求上一页,在内存足够的情况下直接返回内容,反之被可能因内存不够被回收掉了,重新获取内容即可。灵活的缓存,减少了OOM几率。
[ 弱引用 ]
举例:
WeakReference wr = new WeakReference<String>(new String("hello"));
解释: 被标为弱引用的对象被认为是非必须
对象,在发生GC时会被毫不留情的直接回收。
用例: 因为GC不会时刻发生,弱引用也不是说new出来会被立马回收,所以也可以和软引用一样做缓存之类的事。
[ 虚引用 ]
举例:
PhantomReference pr
= new PhantomReference<String>(new String("hello"),new ReferenceQueue<>());
解释: 虚引用必须搭配ReferenceQueue
使用,被标为虚引用的对象,在发生GC时会被放进队列,然后回收。
用例: 和上面说的几个引用比,没发现有什么特别用处,你可以用来记录跟踪对象被垃圾回收的活动。有人形容虚引用为 —— “死亡证明,一般活人是根本不用的,只有人挂了的时候,去火葬场才能查到是哪个人挂了”
总结
表格概览:
引用类型 | 被回收时间 | 用途 | 生存时间 |
---|---|---|---|
强引用 | 从来不会 | 对象的一般状态 | JVM停止运行时 |
软引用 | 内存不足时 | 对象缓存 | 内存不足时 |
弱引用 | jvm垃圾回收时 | 对象缓存 | gc运行后 |
虚引用 | 未知 | 未知 | 未知 |
方便记忆的口诀(笔者亲自提炼):
- 强 —— 有地位,不商量
- 弱 —— 无地位,直接收
- 软 —— 留情面,量满收
- 虚 —— 存队列,排着收
🎏 你学废了吗?如果有帮助的话请不要吝啬免费的点赞哦~
以上是关于[ Java ] 超级大白话解释 —— 强引用弱引用软引用虚引用(59.99秒懂)的主要内容,如果未能解决你的问题,请参考以下文章