JVM工作原理与实战(二十四):堆的垃圾回收-对象引用

news2024/11/24 14:36:46

专栏导航

JVM工作原理与实战

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、软引用

1.软引用的执行过程

2.SoftReference队列机制

二、弱引用

三、虚引用与终结器引用

1.虚引用

2.终结器引用

总结


前言

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了强引用、软引用、弱引用、虚引用、终结器引用等内容。


在Java中,对象的生命周期由垃圾回收器管理。在可达性算法中,描述的对象引用通常指的是强引用,即GCRoot对象对普通对象有引用关系,只要这层关系存在,普通对象就不会被回收。但除了强引用外,Java还设计了其他几种引用方式,以应对不同的内存管理需求。

关于强引用(GCRoot对象对普通对象的引用)的详细讲解可以查看之前的文章:

JVM工作原理与实战(二十三):堆的垃圾回收-引用计数法和可达性分析法-CSDN博客文章浏览阅读466次,点赞10次,收藏7次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了判断堆上的对象是否可以回收的方法(引用计数法、可达性分析法)、查看垃圾回收日志等内容。https://blog.csdn.net/jiangyq_/article/details/135729597

一、软引用

1.软引用的执行过程

软引用是一种相对较弱的引用关系。如果一个对象仅被软引用关联,当内存不足时,这些数据将会被虚拟机视为垃圾回收的候选对象。在JDK 1.2之后,通过SoftReference类实现了软引用。它常被用于缓存的实现。例如,当内存不足时,虚拟机首先尝试回收软引用关联的对象。如果仍不能解决内存问题,软引用中的对象将被回收。如果仍然内存不足,将抛出OutOfMemory异常。

案例:

根对象(GC Root)到目标对象(对象A)形成了引用链,对象A不可回收:

根对象(GC Root)到目标对象(对象A)没有形成引用链,该对象被认为是不可达的,可以被安全地回收。当内存不足时,软引用中的对象(对象A)将被回收:

软引用的执行过程如下:

  1. 将对象使用软引用包装起来,如new SoftReference<对象类型>(对象)。
  2. 当内存不足时,虚拟机尝试进行垃圾回收。
  3. 如果垃圾回收仍不能解决内存不足的问题,回收软引用中的对象。
  4. 如果依然内存不足,抛出OutOfMemory异常。

案例:

将100M的数据放入软引用中:

    byte[] bytes = new byte[1024 *1024 *100];
    SoftReference<byte[]> softReference = new SoftReference<byte[]>(bytes);

2.SoftReference队列机制

在内存不足的情况下,如果软引用所指向的对象被回收,那么SoftReference对象本身也需要被回收。为了解决这个问题,SoftReference提供了一套有效的队列机制,以确保可以准确判断哪些SoftReference对象需要被回收。这套机制使得SoftReference能够与垃圾回收器协同工作,从而优化内存管理。

SoftReference队列机制:

  • 创建与引用队列的关联:在创建SoftReference对象时,通过特定的构造器可以传入一个引用队列。这个队列用于存储SoftReference对象,以便后续的管理和回收。
  • 对象回收与队列更新:当软引用包含的对象被标记为可回收时,该软引用对象会被自动加入到指定的引用队列中。这一步骤确保了被回收对象的跟踪和管理。
  • 强引用删除:为了进一步管理内存,程序需要遍历这些引用队列,并删除SoftReference的强引用。这一操作是为了确保软引用对象不再占用额外的内存空间,从而使其可以被垃圾回收器顺利回收。

这套队列机制确保了内存管理的效率和准确性,使SoftReference能够适应不同的内存需求,有效地管理Java虚拟机的内存资源。

二、弱引用

弱引用的工作原理与软引用在很多方面是相似的,但在垃圾回收方面存在显著差异。主要区别在于,当弱引用关联的对象被垃圾回收时,不论当前系统内存空间足够与否,都会被回收。这一特性使得弱引用在处理内存管理时更为直接和高效。

在JDK 1.2版本之后,Java引入了WeakReference类来实现弱引用机制。这一设计使得弱引用主要在ThreadLocal中得到应用,为其提供了更为灵活和有效的内存管理方案。同时,弱引用对象同样可以利用引用队列进行回收。这一机制确保了垃圾回收器能够跟踪并管理弱引用对象的生命周期,从而更有效地释放内存空间。

案例:

将100M的数据放入弱引用中:

    byte[] bytes = new byte[1024 *1024 *100];
    WeakReference<byte[]> weakReference = new WeakReference<byte[]>(bytes);

三、虚引用与终结器引用

在Java的内存管理中,虚引用和终结器引用是两种较为特殊的引用类型,它们在常规开发中的使用频率相对较低。

1.虚引用

虚引用,也被称为幽灵引用或幻影引用,是一种抽象的引用关系。通过虚引用来获取一个对象是不可能的,因为虚引用仅仅提供了对对象的一个弱化形式的引用关系。其主要用途在于跟踪对象被垃圾回收的行为。当一个对象仅持有虚引用时,它就像没有任何引用一样,随时可能被垃圾回收器回收。

在Java中,PhantomReference类代表了虚引用。它允许程序监控对象何时被垃圾回收,并在回收时收到通知。这在某些场景下是有用的,例如管理外部资源或实现特定的内存管理策略。

2.终结器引用

终结器引用与对象的finalize方法相关联。当一个对象需要被回收时,终结器引用会将其关联到Finalizer类中的一个引用队列中。随后,FinalizerThread线程会从队列中取出对象并执行其finalize方法。需要注意的是,finalize方法的执行是在垃圾回收之后进行的,因此,当对象第二次被回收时,它才真正被回收。

尽管在finalize方法中可以将对象重新使用强引用关联上,但这通常是不推荐的。因为这可能导致内存泄漏或其他不可预见的问题。开发者应该谨慎处理终结器引用的使用,并确保finalize方法在执行完毕后不再保持对对象的引用。


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了强引用、软引用、弱引用、虚引用、终结器引用等内容,希望对大家有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【小白学机器学习3】关于最简单的线性回归,和用最小二次法评估线性回归效果, 最速下降法求函数的最小值

目录 1 什么是回归分析 1.1 什么是线性回归 1.2非线性回归 2 数据和判断方法 2.1 原始数据 2.2 判断方法&#xff1a;最小二乘法 3 关于线性回归的实测 3.1 用直线模拟 3.2 怎么判断哪个线性模拟拟合更好呢&#xff1f; 3.2.1 判断标准 3.2.2 最小二乘法 3.2.3 高维…

2024年数据中心交换机市场预测新鲜出炉,我们做了这些顺应趋势的事儿……

Dell’Oro Group发布的最新报告显示&#xff0c;2023年数据中心交换机市场与年初预测基本一致&#xff0c;200/400Gbps数据中心交换机的销售额几乎翻番。另外&#xff0c;AI&#xff08;人工智能&#xff09;与ML&#xff08;机器学习&#xff09;的发展势必推动服务器、存储、…

MATLAB字符串编辑常用代码

1.字符串赋值 % 字符串赋值 sabcdefg 2.字符串属性和操作 (1)获取字符串长度 sabcdefg;% 字符串赋值 length(a) % 获取字符串长度 (2)连接字符串 % 连接两个字符串,每个字符串最右边的空格被裁切 s1a s2b s3strcat(s1,s2) 3.字符串比较 % strcmp 比较两个字符串是…

STL---Priotity_queue+仿函数的介绍

一、优先级队列的介绍和使用 &#xff08;1&#xff09;介绍 翻译&#xff1a; &#xff08;1&#xff09; 优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 &#xff08;2&#xff09; 此上下文类似于堆&a…

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络 Fedora包含的软件以自由及开放源码许可来发布&#xff0c;并旨在成为该技术领域的领先者。Fedora在专注创新、抢先集成新技术、与上游Linux社区紧密工作方面拥有良好名声。该文档适用于在VMware workstation平台下…

还在为iOS和iPadOS存储不足闷闷不乐?这里有优化空间的详细步骤

储存空间似乎是iPhone和iPad用户最大的抱怨之一,这要归功于应用程序占用了越来越多的储存空间,媒体变得比以往任何时候都更渴望储存。以下是解决方法。 本指南中的屏幕截图来自iPhone,但提示也适用于iPad。必要时将提及设备之间的差异。 如何检查iPhone和iPad上的储存空间…

一个好用的服务器控制面板

简介 它是一个免费开源的管理面板工具&#xff0c;可以帮助你集中管理多个服务器和网站。Ajenti 支持 Linux、BSD、Mac OS X和Windows 等多个操作系统&#xff0c;并且可以通过一个直观的 Web 界面来完成各种系统管理任务。 相比于其他管理面板&#xff0c;Ajenti有以下几个优…

【星海随笔】unix 启动问题记录.

启动Ubuntu操作系统时&#xff0c;直接进入GRUB状态。 调试时候&#xff0c;曾显示 no bootable device no known filesystem detected 注意&#xff1a; 目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本号是 0.9x 以及之前的版本都称为 GRUB Legacy &#xff0c;从 1.x 开始的就称…

【用积分求抛物线与直线围成的面积】

文章目录 一、Problem Discription二、Sample Input and Sample Output三、数学分析与推导计算1. 根据抛物线顶点坐标 P 1 ( x 1 , y 1 ) P_1(x_1, y_1) P1​(x1​,y1​)以及另一个点的坐标 P 2 ( x 2 , y 2 ) P_2(x_2, y_2) P2​(x2​,y2​)&#xff0c;求出抛物线方程2. 根据…

单片机中MCU跑RTOS相比裸机的优势

经常有读者问关于RTOS的问题&#xff0c;比如&#xff1a;我现在要不要学习RTOS&#xff1f; 学习RTOS有什么好处&#xff1f; 我的项目要不要跑RTOS&#xff1f; 问这些问题&#xff0c;其实归根结底还是对RTOS理解的不够&#xff0c;项目开发的经验还不足等。针对这部分朋友…

PyTorch 内 LibTorch/TorchScript 的使用

PyTorch 内 LibTorch/TorchScript 的使用 1. .pt .pth .bin .onnx 格式1.1 模型的保存与加载到底在做什么&#xff1f;1.2 为什么要约定格式&#xff1f;1.3 格式汇总1.3.1 .pt .pth 格式1.3.2 .bin 格式1.3.3 直接保存完整模型1.3.4 .onnx 格式1.3.5 jit.trace1.3.6 jit.scrip…

品牌价值的累积与倍增:指数函数的含义及其在企业运营中的应用

品牌的价值日益凸显。品牌价值的累积与倍增不仅是企业追求的目标&#xff0c;也是市场竞争的重要标志。指数函数作为一种数学模型&#xff0c;对于描述品牌价值的增长具有重要意义。本文将深入探讨指数函数的含义及其在企业运营中的应用&#xff0c;并分析如何通过持续创新、品…

Unity 抽象工厂模式(实例详解)

文章目录 简介实例1实例2 简介 抽象工厂模式是一种创建型设计模式&#xff0c;它提供了一种方式来封装一组相关或相互依赖对象的创建过程&#xff0c;而无需指定具体类。这种模式常用于系统中有多组相关产品族&#xff0c;且客户端需要使用不同产品族中的对象时。 在Unity中&a…

canvas绘制旋转的椭圆花

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

Java 设计者模式以及与Spring关系(四) 代理模式

目录 简介: 23设计者模式以及重点模式 代理模式&#xff08;Proxy Pattern&#xff09; 静态代理示例 spring中应用 动态代理 1.基于JDK的动态代理 target.getClass().getInterfaces()作用 内名内部类写法(更简洁&#xff0c;但不推荐) 2.基于CGLIB实现 spring中应用 …

第137期 Oracle的数据生命周期管理(20240123)

数据库管理137期 2024-01-23 第137期 Oracle的数据生命周期管理&#xff08;20240123&#xff09;1 ILM2 Heat Map3 ADO4 优点5 对比总结 第137期 Oracle的数据生命周期管理&#xff08;20240123&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Orac…

图灵日记之java奇妙历险记--异常包装类泛型

目录 异常概念与体系结构异常的分类异常的处理防御式编程异常的抛出异常的捕获异常声明throwstry-catch捕获并处理 自定义异常类 包装类基本数据类型及其对应包装类装箱和拆箱 泛型泛型使用类型推导 裸类型说明 泛型的编译机制泛型的上界语法 异常概念与体系结构 在java中,将程…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS数据排序

《SPSS统计学基础与实证研究应用精解》4.6 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解4.6节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手教会使…

智能机器人与旋量代数(9)

Chapt 3. 螺旋运动与旋量代数 3.1 螺旋运动 螺旋运动是关于一条空间直线的一个旋转运动&#xff0c;并伴随沿此直线的一个平移。是一种刚体绕空间轴 s s s旋转 θ \theta θ角&#xff0c;再沿该轴平移距离 d d d的复合运动&#xff0c;类似螺母沿螺纹做进给运动的情形。 一…

x-cmd pkg | dasel - JSON、YAML、TOML、XML、CSV 数据的查询和修改工具

目录 简介首次用户快速实验指南基本功能性能特点竞品进一步探索 简介 dasel&#xff0c;是数据&#xff08;data&#xff09;和 选择器&#xff08;selector&#xff09;的简写&#xff0c;该工具使用选择器查询和修改数据结构。 支持 JSON&#xff0c;YAML&#xff0c;TOML&…