我们平常典型编码
Object obj = new Object()
中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用;软引用通过SoftReference
类实现。 软引用的生命周期比强引用短一些;弱引用通过WeakReference
类实现。 弱引用的生命周期比软引用短。
一、强引用
特点:我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用。 当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了,具体回收时机还是要看垃圾收集策略。
应用场景:项目中到处都是。
二、软引用
特点:软引用通过SoftReference类实现。 软引用的生命周期比强引用短一些。只有当 JVM 认为内存不足时,才会去试图回收软引用指向的对象:即JVM 会确保在抛出 OutOfMemoryError 之前,清理软引用指向的对象。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。后续,我们可以调用ReferenceQueue的poll()方法来检查是否有它所关心的对象被回收。如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。
应用场景:软引用通常用来实现内存敏感的缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。
具体实例:图片缓存框架中,“内存缓存”中的图片是以这种引用来保存,使得JVM在发生OOM之前,可以回收这部分缓存。
三、弱引用
特点:弱引用通过WeakReference类实现。 弱引用的生命周期比软引用短。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。由于垃圾回收器是一个优先级很低的线程,因此不一定会很快回收弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
应用场景:弱应用同样可用于内存敏感的缓存。
具体实例:在静态内部类中,经常会使用虚引用。例如,一个类发送网络请求,承担callback的静态内部类,则常以虚引用的方式来保存外部类(宿主类)的引用,当外部类需要被JVM回收时,不会因为网络请求没有及时回来,导致外部类不能被回收,引起内存泄漏。
四、虚引用
特点:虚引用也叫幻象引用,通过PhantomReference类来实现。无法通过虚引用访问对象的任何属性或函数。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
应用场景:可用来跟踪对象被垃圾回收器回收的活动,当一个虚引用关联的对象被垃圾收集器回收之前会收到一条系统通知。
具体实例:一种引用的get()方法返回总是null,所以,可以想象,在平常的项目开发肯定用的少。
来源:https://blog.csdn.net/weixin_44052055/article/details/120856602
延伸阅读
芯片的用途
芯片(Chip)是一个集成电路的简称,它是电子设备中最基础的组件。电子设备,如电脑、手机、电视等几乎所有的电子设备都会使用到芯片。以下是芯片的一些主要用途:
- 数据处理:许多芯片被设计成微处理器,用于执行各种计算和数据处理任务。例如,你的电脑或手机中的中央处理器(CPU)就是一种芯片,它负责处理所有的计算任务。
- 存储数据:有些芯片,如闪存芯片,被用于存储数据。这些芯片可以在你的电脑、手机、USB驱动器或其他设备中找到。
- 网络通信:一些芯片被设计用于处理网络通信,包括无线和有线通信。例如,手机和电脑中的Wi-Fi芯片就是这样的一种。
- 图像处理:图形处理器(GPU)是一种特殊类型的芯片,它专门设计用于处理图像和视频相关的计算任务。GPU在视频游戏、图形设计和近年来的机器学习等领域都有广泛的应用。
- 声音处理:声卡中的音频处理器是用于处理音频信号的芯片,负责生成和播放声音。
- 控制硬件:许多芯片被用于控制电子设备中的其他硬件。例如,电脑主板上有很多芯片,用于控制内存、硬盘、USB设备等。
这些只是芯片的一些主要用途,事实上,芯片的应用领域非常广泛,几乎所有的电子设备和系统都需要使用到芯片。
文章标题:Java强引用、软引用、弱引用、虚引用的区别是什么,发布者:E.Z,转载请注明出处:https://worktile.com/kb/p/53567