JVM修炼之路【10】- 垃圾回收器和垃圾回收算法

news2024/12/23 23:48:25

垃圾回收算法

我们先简要看一下 四种主要的垃圾回收算法

在这里插入图片描述
看到这不禁感慨一下 人家1960年 都搞出GC算法了 太强了


评价标准

既然有这么多算法 那就跟各个牌子的游戏本一样 有个比较,这里我们重点介绍一下 垃圾回收算法的评价标准
这几个标准非常重要是 是后面理解很多东西的基石,大家一定要好好理解

首先大家要理解 垃圾回收也是一个线程 在运行,它的本质和其他我们工作的线程没什么区别,既然是线程就会有占用 就会有阻塞。
一旦触发垃圾回收线程开始垃圾回收的时候, 部分阶段 比如fullgc 会停止所有的用户线程。

也就是说 你的java服务器里的用户线程 全体罚站。

这个过程叫STW ,

所以如果你的系统是频繁用户交互的 那你就要注意 不能使用STW过长的垃圾回收策略
在这里插入图片描述
于是有了下面三个评价标准:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这三个标准 就和 分布式理论里面那个CAP一样 不可兼得。

比如吞吐量 是 用户代码时间 / cg时间+其他所有时间。 这个比例可能很出色,但是分子和分母都越来越大 那cg时间就越来越长

cg时间越来越长 STW最大时间就越来越大


四种垃圾回收算法

标记清除算法

最好理解 最简单 最无脑的算法

我们之前说了GC root 根节点 可达性分析法 ,去寻找那些有根的对象 和断根的对象, 找到那些断线的 需要回收的对象 就清除掉。

就这么简单。

它的优点是 简单 迅速。

但是缺点很多 就是会产生大量的 内存碎片, 这些内存碎片 就是清除之后 留下来的空间 大小不一

在这里插入图片描述

复制算法

复制算法 把内存区域 分成2块:from 、 to。 只有一块可以存储对象、

看到这还不知道它怎么清理, 它的一个缺点就已经暴露了—— 你的内存使用打半折 只有一般能用

首先往from区里面 存对象 ,这时候to 是空的

那么它需要gc的时候 还是用可达性算法 把非断根的那些不需要回收的对象找出来 把这些良好市民 都移动到 to

然后把from 清空。

它的好处就是没有内存碎片 因为移动到to 就整齐排列了
在这里插入图片描述

标记整理

标记整理 就是 标记清除的进化版。

首先它还是一块内存区域 不会像复制算法一样 一分为二。

然后 我们刚才讲了 标记整理是 找到那些需要清除的 然后清除掉就完事了

而标记整理 他们清除之后 把剩下的对象空间重新排列 , 这样那些内存碎片也就都被挤出来了。

但是

就是因为比标记清除多了整理者一步 意味着它的性能不佳。

(单是整理这一步 可能要内存上 大部分的对象地址空间都要移动 , 还记得那个经典问题 arraylist 和linkedlist之间的性能选择吗。 类似于你在动态数组中做增删操作 )

分代回收算法

这个就是前几种算法组合 也是现代最流行的算法

首先他把堆分为 新生代 和老年代

新生代顾名思义 就是刚创建出来的对象。

老年代就是存活时间较长的对象

新生代 中又分为 Eden区(伊甸园区 上帝刚创造人类的地方) S0区 S1区

在这里插入图片描述

我们来讲下这个过程。 首先刚开始 所有区域 都是空的 :

创建第一个对象:
当程序创建第一个对象时,这个对象会被分配到年轻代中。假设这个对象是一个新的实例,它被分配到年轻代的 Eden 区域。

对象存活和垃圾回收:
随着时间的推移,堆内存中会不断创建新的对象。这些对象可能被引用,也可能成为垃圾,即不再被引用。当年轻代的 Eden 区域填满时,会触发一次 Minor GC(年轻代垃圾回收)。在 Minor GC 中,存活的对象会被移动到存活区域(Survivor Space),而不再被引用的对象将被标记为可回收的垃圾。被标记为垃圾的对象将被回收释放。

晋升到老年代:
如果对象在年轻代经过几轮的 Minor GC 后仍然存活,它将被晋升到老年代。通常,对象在老年代存活时间更长,因此老年代的垃圾回收频率相对较低。

Full GC:
当老年代内存空间不足时,会触发 Full GC。Full GC 会对整个堆内存进行垃圾回收,包括年轻代和老年代。在 Full GC 中,所有的存活对象都会被标记并移动,而不再被引用的对象将被回收释放。Full GC 的成本通常比 Minor GC 更高,因为它需要对整个堆内存进行扫描和处理。

Out of Memory:
如果堆内存无法满足程序的内存需求,将会发生 Out of Memory 错误。这通常发生在无法为新对象分配内存空间时,或者在进行垃圾回收后仍然无法腾出足够的内存空间时。此时,程序无法继续执行,并抛出 Out of Memory 错误。


垃圾回收器

首先新手要理解一点 垃圾回收器都是组合使用的 出来G1外,这些乱七八糟的组合大家不用死记硬背。
在这里插入图片描述

这里介绍经典的2种组合,以及最新的垃圾回收器 G1:

如果你关注暂停时间 不想太长 就用 PN+CMS

CMS这个回收器 它的特点是并发执行,允许用户现场和gc线程同时跑, 但是它用的是标记清除算法 容易产生内存碎片

在这里插入图片描述

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

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

相关文章

python基础——类【类的定义和使用、魔术方法】

📝前言: python中的类,自我感觉在某种程度上和C语言的结构体是有共同之处的,如果有兴趣,可以先看看这篇文章:C语言——结构体类型(一),先了解一下C语言中的结构体&#x…

Linux debian gdb dump

1.开发背景 记录 debian 下应用程序崩溃调试方法 2.开发需求 程序越界可以定位到越界的位置附近 3.开发环境 debian 操作系统,如果不支持需要查看是否存在对应的可执行文件 4.实现步骤 4.1 设置 dump 输出大小 ulimit -c unlimited # 设置输出大小 生成core 文…

算力租赁还能如此便宜?怎么现在才告诉我!

作为拥有几年炼丹经验的“炼丹侠”,总会遇到这样的问题:入手过超贵的显卡,性能不稳定,还不能及时更新适配!传输速度慢,算力不稳定,大大影响任务执行效率!数据存储费用高,…

基于FPGA的OMEGA东京奥运会计时器

截至2019年共举办了31届奥运会,其中27届的计时设备都由欧米茄(OMEGA,Ω)提供,今年的东京奥运会将会是第28届。 瑞士计时公司(Swiss Timing)基于火星Mars ZX2核心板打造了为奥运会等大型体育赛事…

支付宝支付之SpringBoot整合支付宝创建自定义支付二维码

文章目录 自定义支付二维码pom.xmlapplication.yml自定义二维码类AlipayService.javaAlipayServiceImpl.javaAlipayController.javaqrCode.html 自定义支付二维码 继&#xff1a;SpringBoot支付入门 pom.xml <dependency><groupId>org.springframework.boot<…

批量人脸画口罩

网上参考的修改了一下&#xff0c;图片放在根目录&#xff0c;命名叫做1.png&#xff0c;批量人脸画口罩 这个程序的目的是为了解决人脸数据集中的特征点缺失的不足 # -*- coding: utf-8 -*- import os import numpy as np from PIL import Image, ImageFile__version__ 0.3…

前端请求404,后端保无此方法

1、微信小程序前端路径404 2、后端报无此路径 3、查看路径下对应的方法 发现忘了在list方法前加GetMapping(“/list”)&#xff0c;加上即可

中伟视界:智慧矿山智能化预警平台功能详解

矿山智能预警平台是一种高度集成化的安全监控系统&#xff0c;它能够提供实时的监控和报警功能&#xff0c;帮助企业和机构有效预防和响应潜在的安全威胁。以下是矿山智能预警平台的一些关键特性介绍&#xff1a; 报警短视频生成&#xff1a; 平台能够在检测到报警时自动生成短…

6.C++:继承

一、继承 //1.类中的保护和私有在当前类中没有差别&#xff1b; //2.在继承后的子类中有差别&#xff0c;private在子类中不可见&#xff0c;所以用protected&#xff1b; class person { public:void print(){cout << "name:" << _name << endl;c…

④【Shiro】Shiro框架进行敏感信息加密

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ ④【Shiro】Shiro框架进行敏感信息加密 实际系…

分布式调度器timer和spring task

1. Timer&#xff08;了解&#xff09; 一、Timer使用方式 Task1 public class Task1 extends TimerTask {Overridepublic void run(){System.out.println("com.aware.Task run");} } Task2 public class Task2 extends TimerTask {Overridepublic void run(){…

如何判断软件测试公司报告是否权威

在当今数字化浪潮中&#xff0c;软件测试报告已成为评估软件性能、确保用户体验、发掘潜在问题的关键所在。然而&#xff0c;面对众多软件测试公司及其纷繁复杂的报告&#xff0c;如何洞察其权威性成为一项亟待解决的任务。本文旨在探讨如何精准判别软件测试公司报告的权威性&a…

React Ant Design 简单实现如何选中图片

效果&#xff1a; 代码&#xff1a; 定义的初始值和方法 const [selected, setSelected] useState(0); // 表示当前选中的图片索引const handleClick (index) > {if (selected index) {setSelected(null); // 如果点击的是已选中的图片&#xff0c;则取消选中状态} else…

AI大模型日报#0418:Stable Diffusion 3开放API、Meta新研究让AI Agent理解物理世界

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 微软刚发布了VASA-1 这个人工智能可以让单张图像具有生动的说话和歌唱能力 摘要: 微软发布了VASA-1人工智能&#xff0c;它能使单…

java算法day56 | 动态规划part15 ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 动规五部曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]。确定递推公式 在确定递推公式的时候&#xff0c;…

显示msvcp140.dll丢失要如何解决?这5种方法高效修复msvcp140.dll

msvcp140.dll是Microsoft Visual C Redistributable软件包中的一个文件&#xff0c;主要用于支持使用C编程语言编写的软件的正常运行。如果你的电脑出现缺少msvcp140.dll的错误消息&#xff0c;可能会影响到某些程序的启动和运行。然而&#xff0c;不必过度担心&#xff0c;因为…

iText 5

依赖 implementation com.itextpdf:itextpdf:5.5.13.3implementation com.itextpdf:itext-asian:5.2.0implementation com.alibaba:fastjson:1.2.83compileOnly org.projectlombok:lombok:1.18.22annotationProcessor "org.projectlombok:lombok:1.18.22"测试 impor…

找不到api-ms-win-crt-runtime-l1-1-0.dll文件5种解决方法

在日常使用计算机的过程中&#xff0c;我们时常会遭遇各类意想不到的问题&#xff0c;其中之一就是“api-ms-win-crt-runtime-l1-1-0.dll丢失”。这个错误通常发生在Windows操作系统中&#xff0c;它表示一个动态链接库文件丢失或损坏。这个问题可能会导致某些应用程序无法正常…

【Vue脚手架】

初始化脚手架 如果下载缓慢请配置npm淘宝镜像&#xff1a; npm config set registry http://registry.npm.taobao.org 全局安装vue脚手架&#xff1a; vue/clinpm install -g vue/cli 1. 创建项目使用命令 vue create xxx 注&#xff1a;后面有选择安装版本&#xff0c;请注意选…

授权协议OAuth 2.0之除了授权码许可还有什么授权流程?

写在前面 源码 。 本文看下OAuth2.0的另外3中授权流程&#xff0c;资源拥有者凭据许可&#xff0c;客户端许可&#xff0c;隐式许可。分别看下具体的使用流程以及该使用场景。 1&#xff1a;资源拥有者凭据许可 资源拥有者凭据许可&#xff0c;这里资源拥有者的凭据是什么呢&…