[ 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秒懂)的主要内容,如果未能解决你的问题,请参考以下文章

java对象的引用级别

Java语言this关键字用法全面总结

shell中的单引号和双引号的区别

Spring是个什么?大白话解释下 !

终于搞懂了,用大白话给你解释Zookeeper的选举机制,包教会

终于搞懂了,用大白话给你解释Zookeeper的选举机制,包教会