【JVM】JVM的垃圾回收机制

news2025/3/13 2:11:50

JVM的垃圾回收机制

  • 对象死亡判断方法
    • 引用计数算法
    • 可达性分析算法
  • 垃圾回收算法
    • 标记清除法
    • 复制算法
    • 标记整理算法
    • 分代算法

Java运行时内存的各个区域,对于程序计数器,虚拟机栈,本地方法栈这三个部分区域而言,其生命周期与相关线程有关,随线程而生,随线程而灭,并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存就自然跟着线程回收了

所以此时垃圾回收关注的就是堆和方法去这两个区域

对象死亡判断方法

引用计数算法

给对象增加一个引用计数器,每当有一个地方引用它时,此时计数器就+1,当引用失效时,计数器就-1 在任何时候计数器为0,此时这个对象就是不能在被使用的,所以此时这个对象就应该被回收

但是在JVM中没有采用引用计数法来管理内存,最主要的原因就是无法解决对象的循环引用问题
在这里插入图片描述

可达性分析算法

JVM首先会从现有的代码中能直接访问的到的引用出发,尝试遍历所有能访问的对象,只要对象能访问到,就会标记成可达,完成整个遍历之后,可达之外的对象,也就是不可达,也就当成垃圾了

此算法的核心就是找到一系列GC roots对象作为起点开始搜索可达对象

Java中,可作为GC roots的对象包含

  1. 虚拟机栈中引用的对象
  2. 方法区中静态属性引用的变量
  3. 方法区中,常量引用的对象
  4. 本地方法栈中native引用的对象

垃圾回收算法

标记清除法

标记清除算法是最基础的收集算法,算法分为标记和清除两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收已经标记的对象

标记清除算法的不足主要有两个

  1. 效率问题:标记和清除这两个过程的效率都不高
  2. 空间问题:标记清除后会产生大量不连续的内存碎片, 空间碎片太多可能会导致以后在程序运行中需要分配较大对象时,无法找到足够连续的内存而不得不提前出发另一次GC

复制算法

复制算法是为了解决标记清除算法的效率问题,他将内存按容量划分为大小相同的两块,每次只使用其中一块,当这块内存需要进行垃圾回收时,会将这个区域内还活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次性清理

标记整理算法

复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。

针对老年代的特点,提出了一种称之为"标记-整理算法"。标记过程仍与"标记-清除"过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。

分代算法

分代算法和上面讲的 3 种算法不同,分代算法是通过区域划分,实现不同区域和不同的垃圾回收策略,从而实现更好的垃圾回收。这就好比中国的一国两制方针一样,对于不同的情况和地域设置更符合当地的规则,从而实现更好的管理,这就时分代算法的设计思想

当前JVM垃圾收集都是采用的分代收集算法

这个算法并没有新思想,只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代。在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象存活率高、没有额外空间对它进行分配担保,就必须采用"标记-清理"或者"标记-整理"算法。

Java代码中,对象纷呈大体两类

  1. 生命周期特别长的
  2. 生命周期特别短的

分代回收按照对象的年龄,来制定不同的回收策略

我们将这个堆分为新生代和老年代,新生代中保存年纪小的对象,老年代中存放年纪大的对象

在新生代区分为伊甸区和幸存区,对象被创建的时候,大部分都进入了伊甸区,这里面存储的是年龄最小的对象,这里面的对象大部分都撑不过第一轮GC,当第一轮GC扫描到达的时候,这个对象就已经是垃圾了,在第一轮GC过后,剩下还没有成为垃圾的对象,就会被通过复制算法,复制到幸存区

幸存区分为两个大小相同空间,在每次GC后,幸存的对象都会移动到另一块大小相同的空间中,下次GC如果还没有成为垃圾,再次返回,循环往复

如果一个对象在经过很多轮GC之后,仍然存活,说明这个对象的生命周期很长了,这个时候,这个对象就来到了老年代

老年代的扫描频次是比较高的,老年代,扫描频次就降低了因为老年代中,不会有太多的对象销毁,因此使用标记整理算法

在上述过程中,有一个特殊情况,如果对象的体积特别大,就会直接进入到老年代,因为大对象不适合进行复制算法

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

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

相关文章

Excel冻结窗格

1、冻结表格首行 点击菜单栏中的“视图”,选择“窗口”选项卡中的“冻结窗格”下的小三角,再选择“冻结首行”; 2.冻结表格首列 点击菜单栏中的“视图”,选择“窗口”选项卡中的“冻结窗格”下的小三角,再选择“冻结…

图扑智慧仓储数据可视化监控平台

随着市场竞争加剧和市场需求的不断提高,企业亟需更加高效、智能且可靠的仓储物流管理方式,以提升企业的物流效率,减少其输出成本,有效应对市场上的变化和挑战。 图扑软件应用自研 HT for Web 产品搭建的 2D 智慧仓储可视化平台&a…

【轻松搞定】Edge 或 Google 无法上网问题

目录 前言 一、解决 Edge 无法上网的问题 1.1 键盘按下 WIN R 或 右键开始标志,启动运行 1.2 输入 regedit 进入注册表管理 1.3 打开到 \HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft 位置下新建项 Edge 1.4 右键 Edge 新建 DWORD (32) 文件&#xff0c…

<FPGA>好的编码风格(1)--尽量避免组合逻辑环路(Combinational Loops)

什么是组合逻辑环路? 组合逻辑环路(Combinational Loops):指组合逻辑的输出信号不经过任何时序逻辑(FF等),而是直接反馈到输入节点,从而构成的电路环路。 此外,如果直接将…

【开源分享】基于Html开发的房贷计算器,模仿新浪财经

房贷计算器是一种房贷计算的在线计算Web应用,按用户选择的贷款类型、贷款金额、期限、利率可计算得出每月月供参考、支付利息、还款总额这些信息。本文模仿新浪财经开发的房贷计算器。 作品预览 https://fangdai.gitapp.cn 源码地址 https://github.com/geeeeeee…

Qt5.12.12构建64位QMYSQL数据库驱动“driver not loaded”

在调用QSqlDatabase::open()时,会报错:“driver not loaded” 原因实际上是mysql 的驱动 qsqlmysql.dll 没有成功加载。 所以本篇文章将详细介绍一下:Qt5.12.12如何构建64位QMYSQL数据库驱动。 执行 写在最前,以下出现的文件路径为我自己电脑安装的路径,可根据自己的路…

vim快捷指令

普通模式—>插入模式 i:插入到当前光标的前面(insert) a:插入到光标的后面(append) o:插入到下一行 I:插入到行首 A:插入到行尾 O:插入到前一行 H:行首 L:页的最后一行的行首 W:光标跳到下一个单词词首 b:上一个单…

广州华锐互动:VR模拟高楼层建筑应急逃生,提供身临其境的虚拟体验

随着城市化进程的不断加速,高层建筑越来越多地出现在我们的生活中。然而,高层建筑的安全问题也日益凸显。一旦发生火灾、地震等突发事件,如何迅速、安全地逃离高楼成为了人们关注的焦点。近年来,虚拟现实(VR&#xff0…

JUC并发编程——ForkJoin与异步回调

ForkJoin (分支合并) 什么是ForkJoin ForkJoin在JDK1.7出现 ,并行执行任务,在大数据量下,能够提高效率 讯飞星火提供的说法: Forkjoin是一种并行计算的算法,用于将一个大任务分解为多个小任务…

【PSO-RFR预测】基于粒子群算法优化随机森林回归预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MinIO (三) 使用Webhook实时同步文件

前言 使用MinIO的过程中,我们这里遇到个需求,系统需要预览3D文件,前端操作,用浏览3D文件的工具打开3D文件的目录即可实现在线预览功能,这个时候问题来了,MinIO上传文件后进行了编译,如下图 这个…

ardupilot开发 --- 外设适配器、拓展外设、AP_Periph、DroneCAN 、UAVCAN 篇

什么是外设适配器,为什么要拓展外设? 飞控的外设接口有限,如串口只有8个,I^2C只有一个,CAN口只有一个,这些接口数量如果不能满足预期的传感器数量,那么就需要对这些接口进行拓展,外…

ELK日志分析系统的详细介绍与部署

文章目录 1. ELK的概述1.1 简介1.2 使用ELK的理由1.3 ELK的主要组件1.3.1 Elasticsearch1.3.2 Kibana1.3.3 Logstash1.3.3.1 简介1.3.3.2 Logstash常用相关命令选项 1.3.3.3 Logstash 的输入和输出流1.3.4 Logstash的相关配置文件 1.3.4 Filebeat1.3.4.1 简介1.3.4.2 filebeat …

【vue2高德地图api】01-创建应用,获取key值

系列文章目录 【vue2高德地图api】视频效果(手机端)先看这里 文章目录 系列文章目录前言创建key(2个)1.1进入控制台1.2进入应用1.3 创建应用1.4输入名称和类型2.1 添加key2.2 选择对应信息2.3 创建js key和服务端 key 总结 前言 …

数仓建设(一)

想了想,我们的数仓的建设是基于大数据平台进行的,中间也经历了比较曲折的过程。 每个行业都有自身的业务区别,不过很多还是比较相通的。 本文将全面讲解数仓建设规范,从数据模型规范,到数仓公共规范,数仓各…

vue3实现el-card的body的样式穿透

:deep(.el-card .el-card__body){padding-top:20px!important; }改el-card的body 将内容的padding变成上下左右都是20px el-card默认是上面为15px,其他左右下都是20px 详解源码vue3的样式穿透scope-CSDN博客

Linux系统中配置系统设置

在Linux系统中配置系统设置->网络设置代理的详细教程如下: 首先,确保您已经安装了NetworkManager和nmtui。在终端中输入以下命令: sudo apt-get update sudo apt-get install network-manager nmtui 打开系统设置。在桌面上点击“设置”…

多媒体应用设计师 第8章 多媒体应用的新技术

1.信息可视化技术 1.1.信息可视化的定义 信息可视化:将广泛存在的非具体数据以能满足人机交互的方式表达出使信息接收员可以方便的分析数据,找出数据规律,完成对信息的处理。信息可视化的两大基础:认知心理学和图像设计。 可视化方式分为:一维&#xf…

unigui添加ssl(https)访问的方法

首先到腾讯云或者阿里云去申请免费的证书,前提是在该服务商那有申请过域名,怎么找出这个界面?网页顶部一般都有个搜索框,输入【证书】或者【SSL】就能看到了,然后点击申请免费证书,把解析信息填入自己的域名…

新版本外国人永久居留身份证EST-100身份证阅读器接口更新

以下是新版本外国人永久居留身份证读取C#代码: //身份证信息 *******************************************************************************************************private void button4_Click(object sender, EventArgs e) { if (FormIsOpenReader.IsOpenR…