深入浅出JVM(十二)之垃圾回收算法

上篇文章深入浅出JVM(十一)之如何判断对象“已死”已经深入浅出的解析JVM是如何评判对象不再使用,不再使用的对象将变成“垃圾”,等待回收

垃圾回收算法有多种,适用于不同的场景,不同的垃圾收集器使用不同的算法

本篇文章将围绕垃圾回收算法,深入浅出的解析垃圾回收分类以及各种垃圾回收算法

垃圾回收算法

垃圾回收分类

垃圾收集器有着多种GC方式,不同的GC方式有自己的特点,回收的堆内存部分也不同

堆内存分为新生代和老年代,新生代存储“年轻”的对象,老年代存储“老”或内存大的对象,对象年龄由经历多少次GC来判断

其中整堆收集时不仅会回收整个堆还会回收元空间(直接内存)

  • 部分收集(Partial GC): 收集目标是部分空间

    • 新生代收集(Minor GC/ Young GC):收集新生代Eden、Survive to、Survive from区
    • 老年代收集(MajorGC/Old GC):收集老年代
    • 混合收集(Mixed GC):收集整个新生代和部分老年代
  • 整堆收集(Full GC): 整个堆 + 元空间

标记-清除算法

Mark-Sweep

标记:从GCRoots开始遍历引用链,标记所有可达对象 (在对象头中标记)

清除:从堆内存开始线性遍历,发现某个对象没被标记时对它进行回收

image-20221222171839962.png

标记-清除算法实现简单、不需要改变引用地址,但是需要两次遍历扫描效率不高,并且会出现内存碎片

注意:这里的清除并不是真正意义上的回收内存,只是更新空闲列表(标记这块内存地址为空闲,后续有新对象需要使用就覆盖)

复制算法

Copying

Survive区分为两块容量一样的Survive to区和Survive from区

每次GC将Eden区和Survive from区存活的对象放入Survive to区,此时Survive to区改名为Survive from区,原来的Survive from区改名为Survive to区 保证Survive to区总是空闲的

如果Survive from区的对象经过一定次数的GC后(默认15次),把它放入老年代

流程图

注意:图中的dean为Eden区(写错)

image-20201120164106097.png

image-20201120164200591.png

注意:最终的survive from区存活对象占用的内存应该是(那两块蓝色)挨着一起的,图中为了标识字分开来了

复制算法不需要遍历,并且不会产生内存碎片,但是会浪费survive区一半的内存,移动对象时需要STW暂停用户线程,并且复制后会改变引用地址(hotspot使用直接指针访问,还要改变栈中reference执行新引用地址)

如果复制算法中对象存活率太高会导致十分消耗资源,因此一般只有新生代才使用复制算法

标记-整理算法

Mark-Compact

标记:从GCRoots开始遍历引用链,标记所有可达对象(在对象头中标记) (与标记-清除算法一致)

整理:让所有存活对象往内存空间一端移动,然后直接清理掉边界以外的所有内存

image-20221222172409619.png

标记-整理算法不会出现内存碎片也不会浪费空间,但是效率低(比标记-清除还多了整理功能),移动对象导致STW和改变reference指向

如果不移动对象会产生内存碎片,内存碎片过多,将无法为大对象分配内存

还有种方法:多次标记-清除,等内存碎片多了再进行标记-整理

分代收集算法
标记清除mark-sweep复制copying标记整理mark-compact
速度
GC后是否需要移动对象不移动对象移动对象移动对象
GC后是否存在内存碎片存在内存碎片不存在内存碎片不存在内存碎片

需要移动对象 意味着 要改变改对象引用地址 也就是说要改变栈中reference指向改对象的引用地址,并且会发生STW停顿用户线程

当空间中存在大量内存碎片时,可能导致大对象无法存储

分代收集算法 : 对待不同生命周期的对象可以采用不同的回收算法(不同场景采用不同算法)

年轻代: 对象生命周期短、存活率低、回收频繁,采用复制算法,高效

老年代: 对象生命周期长、存活率高、回收没年轻代频繁,采用标记-清除 或混用 标记-整理

增量收集算法

mark-sweep、copying、mark-compact算法都存在STW,如果垃圾回收时间很长,会严重影响用户线程的响应

增量收集算法: 采用用户线程与垃圾收集线程交替执行

增量收集算法能够提高用户线程的响应时间,但存在GC、用户线程切换的开销,降低了吞吐量,GC成本变大

分区算法

堆空间越大,GC时间就会越长,用户线程响应就越慢

分区算法: 将堆空间划分为连续不同的区,根据要求的停顿时间合理回收n个区,而不是一下回收整个堆

每个区独立使用,独立回收,根据能承受的停顿时间控制一次回收多少个区

G1收集器以及两块低延迟收集器Shenandoah、ZGC就使用到这种分区算法

总结

本篇文章围绕垃圾回收算法,深入浅出解析垃圾回收分类、标记清除、复制、标记整理、分代收集、增量收集、分区算法等多种算法

从垃圾回收空间上划分可以分为Full GC回收整个堆加上元空间、Minor GC回收新生代、major GC回收老年代、mixed GC回收新生代加老年代

标记清除算法会遍历引用链标记可达对象从而清理不可达对象,会产生内存碎片,速度一般

复制算法不会产生内存碎片,并且速度很快,但是会浪费survivor区一半空间,并且会移动对象

标记整理算法在标记清理基础上增加整理功能,不会产生内存碎片,但会移动对象,速度慢

不同的算法有不同的特点,应对新生代可以使用复制算法,应对老年代可以使用标签清除/整理算法

增量收集使用GC、用户线程交替执行,虽然降低用户响应,但线程切换、吞吐量下降会增加GC成本

分区算法将堆内存划分为多个区,根据能够接收的停顿时间来回收性价比高的多个区,停顿时间既在能够接收时间内,又能够回收性能比高的区

最后(一键三连求求拉~)

本篇文章将被收入JVM专栏,觉得不错感兴趣的同学可以收藏专栏哟~

本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

Matlab自学笔记二十七:详解格式化文本sprintf各参数设置方法

1.一个程序引例 上篇文章已经介绍了格式化文本的初步应用,程序示例如下: sprintf(|%f\n|%.2f\n|%8.2f,pi*ones(1,3)) 2.格式化操作符各字段的含义解析 格式化操作符可以有六个字段,只有主字符%和转换格式是必需的,其他都是可选…

DWT硬件延时

DWT硬件延时 文章目录 DWT硬件延时软件&硬件延时方案软件延时硬件延时方案 DWT硬件延时方案DWT硬件延时方案DEMCR寄存器DWT硬件延时方案实现延时初始化:US延时:MS延时: 软件&硬件延时方案 软件延时 static void Delay(uint32_t cou…

Sora抢饭碗!好莱坞大亨停止8亿美元投资

好莱坞消息,著名演员、影视投资人Tyler Perry在看到OpenAI最新发布的文生视频模型Sora后,停止了8亿(约57亿元)美元的投资。 该投资项目位于亚特兰大,本来要扩展十几个摄影棚用于影视剧的拍摄(类似横店影视…

企业微信主体怎么转让给别人?

企业微信变更主体有什么作用?当我们的企业因为各种原因需要注销或已经注销,或者运营变更等情况,企业微信无法继续使用原主体继续使用时,可以申请企业主体变更,变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

C++笔记(面对对象部分复习向)

B站:黑马程序员C教程 栈区,全局区,堆区和代码区 析构、构造和static 对象成员与类本身构造顺序,先成员后自己;析构则相反 static修饰成员变量,所有对象共享一份内存,编译阶段分配内存,类内声明…

Windows部署WebDAV服务并映射到本地盘符实现公网访问本地存储文件

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透,将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav,并且结合cpolar的内网穿透工具实现在公网访…

使用CE查找共享代码的多种方法

一般在游戏中,我们会有这样的定义Player和怪物NPC: // 基类 Character class Character { protected:std::string name;int64_t id;int32_t hp;int32_t mp;int32_t level;public:Character(const int64_t name) : id(id) {}virtual void attack() {…

做了个很牛的网站,可以搜索网站的网站到底有多好用?

今天给大家推荐的网站叫做:毒蘑菇 - 搜索 毒蘑菇搜索,顾名思义呢,搜索的功能比较好用,大家上网的时候总是需要记住网站的地址,即使你知道网站的名称,也得跳转到百度然后在搜索,有时候百度上那么…

Windows Server 2012 IIS中发布ASP.NET CORE项目

服务器安装IIS: 微软官网下载SDK: 下载Runtime官网:https://dotnet.microsoft.com/download/dotnet-core 安装成功重启IIS: VS发布项目:

流浪动物救助平台:Java开发的实践与思考

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

DevOps 周期的 6 个 C

中型到大型软件开发项目涉及许多人员、多个团队、资源、工具和开发阶段。它们都需要以某种方式进行管理和简化,不仅可以获得所需的产品,而且还要确保将来在不断变化的环境下易于管理和维护。组织通常遵循许多项目管理模型和技术。DevOps 是其中之一&…

精益生产,创新驱动:机器人技术引领企业的未来之路

随着自动化技术的普及和物联网、人工智能技术的迅速发展,全球制造业正在经历着一场革命性的变革。传统以人力劳动为基础的制造业正逐渐向以机器为主导的智能生产模式转型。企业们正积极探索更高效的制造方式,通过新兴技术提升生产力,同时降低…

该微信用户未开启“公众号安全助手”的消息接收功能,请先开启后再绑定解决操作步骤

1. 关注“公众平台安全助手” 2. 进入“公众平台安全助手”,点击右上角的用户图标,进入公众号信息界面。 3. 进入“公众号信息”界面后,点击右上角的…图标,打开更多选项。 4. 打开“更多选项”后,选择设置选项&#x…

Python高性能web框架--Fastapi快速入门

文章目录 fastapi框架一、预备知识点1.1、http协议一、简介二、 http协议特性三、http请求协议与响应协议 1.2、api接口 二、quick start简单案例 fastapi框架 Fastapi,一个用于构建 API 的现代、快速(高性能)的web框架。 fastapi的两个核心…

随机分布模型

目录 前言 一、离散型随机变量 1.1 0-1分布 1.2 二项分布 1.3 帕斯卡分布 1.4 几何分布 1.5 超几何分布 1.6 泊松分布 二、连续型随机变量 2.1 均匀分布 2.2 指数分布 2.3 高斯分布/正态分布 2.4 分布(抽样分布) 2.5 t分布(抽样…

pytest钩子函数-pytest_runtest_logreport提取测试用例相关信息

问题:想在每个日志中记录测试用例开始结束时间,获取到测试用例的名称。 解决办法:使用钩子pytest_runtest_logreport 在pytest中,想要在conftest.py文件中获取正在运行的测试用例的名称,可以使用pytest_runtest_logre…

玩转ChatGPT:参考文献速查

一、写在前面 各位大佬,我又回来了,最近2月太忙啦(过年、奶娃、本子、材料、结题),断更了。现水一篇证明我还活着!!! 最近在写国自然本子,遇到一个估计大家都会遇到的问…

node14下运行项目报错:regeneratorRuntime is not defined

regeneratorRuntime is not defined,这是由于配置babel出错问题,由于使用了es7语法如async/await而当前babel版本过低 解决: npm install -D babel-plugin-transform-runtime babel-runtime 安装完成后在.babelrc文件下配置: &qu…

Centos7.9环境源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库: sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

Easy-Jmeter: 性能测试平台

目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…
最新文章