Java 强、弱、软、虚,你属于哪一种?

简介: Java 强、弱、软、虚,你属于哪一种?

Java中的四种引用

Java中有四种引用类型:强引用、软引用、弱引用、虚引用。


Java为什么要设计这四种引用

Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。


Java设计这四种引用的主要目的有两个:


可以让程序员通过代码的方式来决定某个对象的生命周期;


有利用垃圾回收。


强引用

强引用是最普遍的一种引用,我们写的代码,99.9999%都是强引用:image.png这种就是强引用了,是不是在代码中随处可见,最亲切。


只要某个对象有强引用与之关联,这个对象永远不会被回收,即使内存不足,JVM宁愿抛出OOM,也不会去回收。


那么什么时候才可以被回收呢?当强引用和对象之间的关联被中断了,就可以被回收了。


我们可以手动把关联给中断了,方法也特别简单:

image.png我们可以手动调用GC,看看如果强引用和对象之间的关联被中断了,资源会不会被回收,为了更方便、更清楚的观察到回收的情况,我们需要新写一个类,然后重写finalize方法,下面我们来进行这个实验:image.png可以很清楚的看到资源被回收了。


当然,在实际开发中,千万不要重写finalize方法


在实际的开发中,看到有一些对象被手动赋值为NULL,很大可能就是为了“特意提醒”JVM这块资源可以进行垃圾回收了。点击这里获取一份 JVM 实战教程。


软引用

下面先来看看如何创建一个软引用:image.png代表最大堆内存是20M。

运行结果:image.png可以很清楚的看到手动完成GC后,软引用对象包裹的byte[]还活的好好的,但是当我们创建了一个10M的byte[]后,最大堆内存不够了,所以把软引用对象包裹的byte[]给干掉了,如果不干掉,就会抛出OOM。


软引用到底有什么用呢?比较适合用作缓存,当内存足够,可以正常的拿到缓存,当内存不够,就会先干掉缓存,不至于马上抛出OOM。说到缓存,大家可以关注微信公众号Java技术栈获取更多干货。


弱引用

弱引用的使用和软引用类似,只是关键字变成了WeakReference:


image.png这是几个意思,竟然直接返回了null。

这就是虚引用特点之一了:无法通过虚引用来获取对一个对象的真实引用。

那虚引用存在的意义是什么呢?这就要回到我们上面的代码了,我们把代码复制下,以免大家再次往上翻:image.png创建虚引用对象,我们除了把包裹的对象传了进去,还传了一个ReferenceQueue,从名字就可以看出它是一个队列。


虚引用的特点之二就是 虚引用必须与ReferenceQueue一起使用,当GC准备回收一个对象,如果发现它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的ReferenceQueue中。


我们来用代码实践下吧:image.png我们简单的分析下代码: 第一个线程往集合里面塞数据,随着数据越来越多,肯定会发生GC。 第二个线程死循环,从queue里面拿数据,如果拿出来的数据不是null,就打印出来。


从运行结果可以看到:当发生GC,虚引用就会被回收,并且会把回收的通知放到ReferenceQueue中。


虚引用有什么用呢?在NIO中,就运用了虚引用管理堆外内存。


推荐去我的博客阅读更多:


1.Java JVM、集合、多线程、新特性系列教程


2.Spring MVC、Spring Boot、Spring Cloud 系列教程


3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程


4.Java、后端、架构、阿里巴巴等大厂最新面试题


觉得不错,别忘了点赞+转发哦!


image.pngimage.png

相关文章
|
8月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
167 0
|
8月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
74 0
|
6月前
|
存储 缓存 Java
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
|
8月前
|
缓存 Java
Java中四种引用类型(强、软、弱、虚)
Java中四种引用类型(强、软、弱、虚)
基础问题-Java的四种引用,强弱软虚,用到的场景各是什么?
基础问题-Java的四种引用,强弱软虚,用到的场景各是什么?
102 1
|
Java 索引
Java三大异常概念和处理步骤(防患于未然)
异常分为编译时异常和运行时异常
252 0
Java三大异常概念和处理步骤(防患于未然)
|
Java 编译器 API
全网最硬核 Java 新内存模型解析与实验 - 2. 原子访问与字分裂
全网最硬核 Java 新内存模型解析与实验 - 2. 原子访问与字分裂
全网最硬核 Java 新内存模型解析与实验 - 2. 原子访问与字分裂
java中的四种引用——强、软、弱、虚
java中的四种引用——强、软、弱、虚
java中的四种引用——强、软、弱、虚
|
存储 缓存 Java
Java对象引用四个级别(强、软、弱、虚)
最近,高级Java技术栈微信群中,有一些猿友在讨论JVM中对象的周期问题,有谈到引用的级别,现在为大家做个总结吧,虽然大多数公司并没有意识或者用到这些引用,但了解这些基本概念对熟悉整个垃圾回收机制和面试是非常有帮助的。
142 0
Java对象引用四个级别(强、软、弱、虚)
|
Java 程序员 编译器
恕我直言,我怀疑你并不会用 Java 枚举(1)
恕我直言,我怀疑你并不会用 Java 枚举
136 0
恕我直言,我怀疑你并不会用 Java 枚举(1)

热门文章

最新文章