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

垃圾回收算法

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

在这里插入图片描述
看到这不禁感慨一下 人家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线程同时跑, 但是它用的是标记清除算法 容易产生内存碎片

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初学SSRF总结

什么是SSRF SSRF是由攻击者构造通过服务端发起请求的安全漏洞。通常情况下,SSRF的攻击对象是外部无法访问的内网(因为是由服务端发起的请求所以攻击能够访问到内部系统) 由于服务端提供了从其它服务器获取数据的功能,但是有没有…

PlanUML和Mermaid哪个好?

引言 在当今信息化快速发展的时代,数据可视化和图表工具不仅对于程序员,也对于非技术背景的人士至关重要。绘图工具可以帮助我们更好地理解和表达复杂的概念或数据流。PlantUML和Mermaid是两款被广泛使用的绘图语言,它们都能够通过简洁的文本…

mynet开源库

1.介绍 个人实现的c开源网络库. 2.软件架构 1.结构图 2.基于event的自动分发机制 3.多优先级分发队列,延迟分发队列 内部event服务于通知机制的优先级为0,外部event优先级为1. 当集中处理分发的event_callback时&#xff0c…

Spring Boot 框架集成Knife4j

本次示例使用 Spring Boot 作为脚手架来快速集成 Knife4j,Spring Boot 版本2.3.5.RELEASE,Knife4j 版本2.0.7&#xff0c;完整代码可以去参考 knife4j-spring-boot-fast-demo pom.xml 完整文件代码如下 <?xml version"1.0" encoding"UTF-8"?> &l…

Terraform进阶技巧

Terraform 是管理 IaC 的强大工具&#xff0c;常用常新。在这一部分我们将探索 Terraform 的进阶技能&#xff0c;包括 Terraform 模块、远程状态存储、Terraform 工作区以及自定义 Provider。 1、Terraform 模块 Terraform 模块是可复用的 Terraform 代码包&#xff0c;其…

Scaffold-GS 代码阅读笔记

1. 系统启动部分 使用 python 中的 parser 库 为配置系统的参数设定, 和3DGS 类似&#xff0c;并且使用safe_state(args.quiet) 函数 为每一次的 log 输出加上对应的 时间戳 ## 配置参数的设定lp ModelParams(parser)op OptimizationParams(parser)pp PipelineParams(pars…

嵌入式linux系统链接腾讯云的方法

各位开发者大家好,今天主要给大家分享一个,如何使用linux系统链接腾讯云的方法,因为微信小程序越来越普遍,链接腾讯云也是日常必须掌握的一个技能。 第一:【实验目的】 1、linux 系统连接腾讯云的方法 第二:【实验原理】 涉及到原理图添加原理图 2、linux开发板 …

Windows:Redis数据库图形化中文工具软件——RESP(3)

这个是用于连接redis数据库的软件工具&#xff0c;安装在windows上的图形化界面&#xff0c;并且支持中文&#xff0c;是在github上的一个项目 1.获取安装包 发布 lework/RedisDesktopManager-Windows (github.com)https://github.com/lework/RedisDesktopManager-Windows/rel…

6.11物联网RK3399项目开发实录-驱动开发之定时器的使用(wulianjishu666)

嵌入式实战开发例程【珍贵收藏&#xff0c;开发必备】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tkDBNH9R3iAaHOG1Zj9q1Q?pwdt41u 定时器使用 前言 RK3399有 12 个 Timers (timer0-timer11)&#xff0c;有 12 个 Secure Timers(stimer0~stimer11) 和 2 个 …

学习JavaEE的日子 Day35 字节流

5.字节流 应用场景&#xff1a;操作二进制数据&#xff08;音频、视频、图片&#xff09; abstract class InputStream – 字节输入流的基类&#xff08;抽象类&#xff09; abstract class OutputStream – 字节输出流的基类&#xff08;抽象类&#xff09; class FileInputSt…

JVM 垃圾回收算法

JVM 垃圾回收算法 标记清除算法复制算法标记整理算法分代算法 标记清除算法 标记-清除&#xff08;Mark-Sweep&#xff09;算法属于早期的垃圾回收算法&#xff0c;它是由标记阶段和清除阶段构成的。标记阶段会给所有的存活对象做上标记&#xff0c;而清除阶段会把没有被标记的…

记录一次浅拷贝导致的缺陷

背景&#xff1a;假期表查询&#xff0c;表中存放的工作日信息是按照月份维度的&#xff0c;例如1月的假期表信息是NNNYYYYYNN.....一共31天&#xff0c;如果是工作日那么就是Y&#xff0c;如果非工作日那就是N。获取指定日期的下一个工作日&#xff0c;就会先查出这个月份的这…

史上首位阿贝尔奖、图灵奖双得主!2023图灵奖授予随机性大佬Avi Wigderson

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 这位多产的研究者发现了随机性和计算之间的深刻联系&#xff0c;其贡献影响了密码学、复杂性…

LLM激活稀疏性加速

相关工作 Deja vu Contextual sparsity for efficient llms at inference time LLM in a flash Efficient Large Language Model Inference with Limited Memory ReLU Strikes Back Exploiting Activation Sparsity in Large Language Models ReLU2 Wins: Discovering Effi…

家居网购项目(一)

文章目录 1.前置知识1.项目开发阶段2.Java经典三层架构3.项目具体分层&#xff08;包方案&#xff09;4.MVC 2.开发环境搭建1.新建普通javaweb项目&#xff0c;导入jar包2.创建项目结构3.搭建前端页面 3.会员注册前端js校验1.需求分析2.代码login.html 3.结果4.调试阶段1.验证信…

[目标检测] OCR: 文字检测、文字识别、text spotter

概述 OCR技术存在两个步骤&#xff1a;文字检测和文字识别&#xff0c;而end-to-end完成这两个步骤的方法就是text spotter。 文字检测数据集摘要 daaset语言体量特色MTWI中英文20k源于网络图像&#xff0c;主要由合成图像&#xff0c;产品描述&#xff0c;网络广告(淘宝)MS…

Linux下使用C语言实现高并发服务器

高并发服务器 这一个课程的笔记 相关文章 协议 Socket编程 高并发服务器实现 线程池 使用多进程并发服务器时要考虑以下几点&#xff1a; 父进程最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符)系统内创建进程个数(与内存大小相关)进程创建过多是否降低整体…

代码随想录训练营day36

第八章 贪心算法 part05 1.LeetCode. 无重叠区间 1.1题目链接&#xff1a;435. 无重叠区间 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;B站卡哥视频 1.2思路&#xff1a;我来按照右边界排序&#xff0c;从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区…

yolov8训练自己数据集的一些小细节

例如我的路径格式如下: 这里要保证两个对齐, train/images/img1.jpg,2,3,xxx train/labels/img1.txt,2,3,xxx val/images/img1.jpg,2,3,xxx val/labels/img1.txt,2,3,xxxyaml文件读取路径的时候,个人猜测是依靠替换字符串找标签的, 因为yaml文件里没有指明如何加载labels,它后…

MobX原理剖析:基于可观察状态和自动依赖追踪的响应式状态管理

我们用代码示例来说明 MobX 的核心原理。 首先,我们定义一个简单的 Store 类,其中包含一个可观察的计数器状态: import { observable, action } from mobx;class CounterStore {observable count 0;actionincrement () > {this.count;};actiondecrement () > {this.…