系列四、强引用、软引用、弱引用、虚引用分别是什么?

一、整体架构

二、强引用(默认支持模式)

2.1、概述

        当内存不足时,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收。

        强引用是我们最常见的普通对象引用,只要还有强引用指向另一个对象,就表明该对象还"活着",垃圾收集器不会回收这种对象。在Java中最常见的就是强引用,把一个对象赋给一个

一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收器回收的,即使该对象永远都不会被JVM回收。因此强引用是造成Java内存泄露的主要原因之一。

        对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显示地将强引用赋值为null,一般认为就是可被垃圾收集器收集的了。(具体回收时机还是要看垃圾收集策略)。

2.2、案例代码

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/19 18:13* @Description: 强引用案例演示*/
public class StrongReferenceMainApp {public static void main(String[] args) {// 这样定义的默认就是强引用Object o1 = new Object();// o2引用赋值Object o2 = o1;// o1置空o1 = null;System.gc();System.out.println(o2);System.out.println(o1 == null);System.out.println(o2 == null);}}

三、软引用

3.1、概述

        软引用是一种相对强引用弱化了一些的引用,需要用java.lang.ref.SoftReference类来实现,可以让对象豁免一些垃圾收集。

        对于只有弱引用的对象来说:

                当系统内存充足时,不会被回收;

                当系统内存不足时,会被回收;

        软引用通常用在对内存敏感的程序中,比如高速缓存就有用到软引用,内存够用的时候就保留,不够用就回收!

3.2、案例代码

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/19 18:13* @Description: 软引用案例演示*/
public class SoftReferenceMainApp {public static void main(String[] args) {Object o1 = new Object();SoftReference<Object> softReference = new SoftReference<>(o1);System.out.println(o1);System.out.println(softReference.get());o1 = null;System.gc();System.out.println(o1);System.out.println(softReference.get());}}

四、弱引用

4.1、概述

        弱引用需要使用java.lang.ref.WeakReference类来实现,它比软引用的生存期更短。

        

        对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管JVM的内存是否足够,都会回收该对象占用的内存;

4.2、案例代码

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/19 18:13* @Description: 弱引用案例演示*/
public class WeakReferenceMainApp {public static void main(String[] args) {Object o1 = new Object();WeakReference<Object> weakReference = new WeakReference<>(o1);System.out.println(o1);System.out.println(weakReference.get());o1 = null;System.gc();System.out.println(o1);System.out.println(weakReference.get());}}

4.3、软引用和弱引用的适用场景

假设有一个应用需要读取大量的本地图片:

        如果每次读取图片都从硬盘读取,则会严重影响性能;

        如果一次性全部加载大内存中,又有可能造成内存溢出;

        此时,可以使用软引用来解决这个问题,思路如下:

        用一个HashMap来保存图片的路径和相应图片对象关联的弱引用之间的映射关系,当内存不足时,JVM自动回收这些缓存图片对象所占用的空间,从而有效的避免OOM的问题。

        Map<String,SoftReference<Bitmap>> imageCache = new HashMap<String,SoftReference<Bitmap>>();

4.4、你知道弱引用的话,能谈谈WeakHashMap吗

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/19 18:44* @Description: 你知道弱引用,能谈谈WeakHashMap吗?*/
public class WeakHashMapMainApp {public static void main(String[] args) {WeakHashMap<Integer, String> map = new WeakHashMap<>();Integer key = new Integer(2);String value = "weakHashMap";map.put(key, value);System.out.println(map);key = null;System.out.println(map);System.gc();System.out.println(map + "\t" + map.size());}}

五、虚引用 

5.1、概述

        虚引用需要java.lang.ref.PhantomReference类来实现。

        顾名思义,虚引用就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾收集器回收,它不能单独使用也不能通过它来访问对象,虚引用必须和引用队列(ReferenceQueue)联合使用。

        虚引用的主要作用是用来跟踪对象被垃圾回收的状态。仅仅是提供了一种确保对象被finalize以后,做某些事情的机制。

        PhantomReference的get()总是返回null,因此无法访问对应的引用对象。其意义在于说明一个对象已经进入finalization阶段,可以被gc回收,用来实现比finalization机制更灵活的回收操作。

        换句话说,设置虚引用关联的唯一目的就是在这个对象被收集器回收的时候,收到一个系统通知或者后续执行进一步的处理。

        Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。

5.2、引用队列

5.3、案例代码

/*** @Author : 一叶浮萍归大海* @Date: 2023/11/19 19:10* @Description: 虚引用案例代码*/
public class PhantomReferenceMainApp {public static void main(String[] args) {Object o1 = new Object();ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();PhantomReference<Object> phantomReference = new PhantomReference<>(o1,referenceQueue);System.out.println(o1);System.out.println(phantomReference.get());System.out.println(referenceQueue.poll());}}

六、GCRoot和四大引用小总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/195719.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为模拟器dhcp实验

实验需求&#xff0c;pc1 pc2 pc3 获取到地址且能ping通&#xff0c;pc1 pc2 为地址池模式&#xff0c;pc3为接口模式 上配置 #sysname AR1# dhcp enable # interface GigabitEthernet0/0/0ip address 10.0.47.254 255.255.255.0 dhcp select relaydhcp relay server-ip 10.0…

在线随机字符串生成工具

具体请前往&#xff1a;在线随机字符串生成器--通过该工具生成动态复杂随机密码,随机字符串等&#xff0c;加密盐等

C语言实现带头双向循环链表

文章目录 写在前面1. 链表节点的定义2. 链表的初始化3. 插入数据3.1 头插3.2 尾插3.3 在指定位置的前面插入数据 4 删除数据4.1 头删4.2 尾删4.3 删除指定位置的数据 5 查找并修改数据5. 链表的销毁 写在前面 上面文章用C语言实现了单链表的增删查改&#xff0c;我们知道&…

安顿APP3.0全新升级,引领智能穿戴健康革新,专注预警疾病风险

随着人们生活水平的提高和工作压力的增加&#xff0c;心脑血管疾病已经成为现代社会的严重问题&#xff0c;特别是心梗、脑卒中等疾病已经开始夺去年轻人的生命。 据报道&#xff0c;近年来&#xff0c;多位年轻人因心脑血管疾病突发去世&#xff0c;如42岁的知名男演员、30岁的…

oncoPredict文献学习

原文&#xff1a;oncoPredict: an R package for predicting in vivo or cancer patient drug response and biomarkers from cell line screening data oncoPredict&#xff1a;一种R包&#xff0c;用于从细胞系筛选数据中预测体内或癌症患者的药物反应和生物标志物 - PMC (n…

第十九章Java绘图

19.1Java绘图类 绘图是高级程序设计中非常重要的技术。 19.1.1Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制 19.1.2Graphics2D类 使用Graphics2D类可以完成简单的图形绘制任务&#xff0c;但是她所实现的功能…

PC业务校验(已有该名称,已有该编码)

rules: {name: [{ required: true, message: "部门名称不能为空", trigger: "blur" },{min: 2,max: 10,message: "部门名称的长度为2-10个字符",trigger: "blur",},{trigger: "blur",validator: async (rule, value, callba…

图像倾斜角度求取-Radon变换

Radon算法 Radon&#xff08;拉东&#xff09;算法是一种通过定方向投影叠加&#xff0c;找到最大投影值时角度&#xff0c;从而确定图像倾斜角度的算法。具体过程如图所示 图1 Radon变换算法 Radon计算示例 对于纹理方向明显的图像&#xff0c;如图2所示&#xff0c;可以通…

5.Java中的注释及Javadoc文档

本文讲解 Java 中的注释以及 Javadoc 文档 ~ 文章目录 1. 注释1.1 引言1.1.1 何为注释&#xff1f;1.1.2 注释有何用&#xff1f;1.1.2.1 方便阅读1.1.2.2 调试程序 1.1.3 单行注释和多行注释 1.2 方法注释1.2.1 什么是方法注释&#xff1f;1.2.2 如何写方法注释&#xff1f;1.…

C/C++通过位操作实现2个uint32_t合并为uint64_t

#include <iostream> using namespace std;int main() {uint32_t a 10;uint32_t b 600;//先将uint32_t的a转为uint64_t&#xff0c;此时a前面32位都是0&#xff0c;然后左移32位&#xff0c;此时右32位为0&#xff0c;最后加上uint32_t类型的b&#xff0c;填充右32位的…

打开游戏提示xapofx1_5.dll丢失如何修复?xapofx1_5.dll缺失的修复教程分享

xapofx1_5.dll是一个重要的Windows系统文件&#xff0c;它主要负责处理图形渲染和多媒体功能。如果在计算机中找不到xapofx1_5.dll&#xff0c;可能会导致程序无法正常运行。下面是关于xapofx1_5.dll丢失的4个修复方法以及xapofx1_5.dll的作用和丢失原因的介绍。 一、xapofx1_…

Java 算法篇-链表的经典算法:有序链表去重、合并多个有序链表

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 链表的说明 2.0 有序链表去重的实现方式 2.1 有序链表去重(保留重复的节点) - 使用递归来实现 2.2 有序链表去重(保留重复的节点) - 使用双指针来实现 2.3 有序…