GVM垃圾收集算法

分代收集理论

目前主流JVM虚拟机中的垃圾收集器,都遵循分代收集理论

  • 弱分代:绝大多数对象都是朝生夕灭
  • 强分带:经历越多次垃圾收集过程的对象,越难以回收,难以消亡

按照分代收集理论设计的“分代垃圾收集器”,所采用的设计原则:收集器应该将Java堆划分成不同的区域,然后将回收对象依据其年龄(年龄即对象经历过垃圾收集过程的次数——分配到不同的区域存储。

分代存储

        如果一个区域中大多数对象都是朝生夕灭(新生代),难以熬过垃圾收集过程的话,把他们集中存储在一起,每次回收时,只关注如何保留少量存活对象,而不是去标记大量将要回收的对象,就能以较低代价回收到大量的空间。

        如果一个区域中大多数对象都是难以回收(老年代),那么把它们集中放在一起,JVM虚拟机就可以使用较低的频率,来对这个区域进行回收。

        这样设计的好处是,兼顾垃圾收集的时间开销和内存空间的有效利用。

分代收集

堆区按照分代存储的好处:

        在Java堆区划分成不同区域后,垃圾收集器才可以每次只回收其中某一个或者某些区域,所以才有MinorGC、MajorGC、FullGC等垃圾收集类型划分。

        在Java堆区划分成不同区域后,垃圾收集器才可以针对不同的区域,安排与该区存储对象存亡特征相匹配的垃圾收集算法:标记-清除算法、标记-复制算法、标记-整理算法。

垃圾收集类型划分:

  • 部分收集(Partial GC):没有完整收集整个Java堆的垃圾收集,其中又分为:
    • 新生代收集(Minor GC / Young GC)
    • 老年代收集(Major GC / Old GC)
    • 混合收集(Mixed GC):收集整个新生代和部分老年代的垃圾收集。
  • 整堆收集(Full GC):收集整个Java堆的垃圾收集。

垃圾收集算法

标记-清除算法(Mark-Sweep)

“标记-清除”算法实现思路:

        该算法分为“标记”和“清除”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到的。

“标记-清除”算法会带来的两个明显的问题:

  1. 执行效率不稳定问题:如果执行垃圾收集的区域,大部分对象是需要被回收的,则需要大量的标记和清除动作,导致效率变低。
  2. 内存空间碎片化问题:标记清除后会产生大量不连续的碎片,空间碎片太多,会导致分配较大对象时,无法找到足够的连续空间,从而会触发新的垃圾收集动作。

标记-复制算法(Copying)

“标记-复制”算法实现思路:

        “标记-复制”收集算法简称“复制算法”,为了解决“标记-清除”面对大量可回收对象时执行效率低下的问题。

        该算法将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把已使用的空间一次清理掉。

“标记-复制”算法特点:

        如果内存中多数对象都是存活的,这种算法将会产生大量的内存见复制的开销,但对于多数对象都是可回收的情况,算法仅需要复制少数存活对象而且每次都是针对整个半区进行内存回收,分配内存时也就不用考虑有空间碎片的复杂情况,只要移动堆顶指针,按顺序分配即可。这样实现简单,运行高效。

“标记-复制”算法的问题:

  1. 对象存活率较高,需要进行较多的内存间复制,效率较低
  2. 浪费过多的内存,使现有的可用空间变为原先的一半

标记-整理算法(Mark-Compact)

“标记-整理”算法实现思路:

        标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象像内存空间一端移动,然后直接清理边界以外的内存,这样清理的机制,不会像标记-整理那样留下大量的内存碎片。

综上所述

        当前虚拟机的垃圾收集都基于分代收集思想,根据对象存活周期的不同,将内存分为几个不同的区域,在不同的区域使用不同的垃圾收集算法

        例如:Heap堆分为新生代老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

        在新生代中,每次收集都会有大量垃圾对象被回收,所以可以选择“标记-复制”算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。

        在老年代中,对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以选择“标记-清除”或“标记-整理”算法进行垃圾收集。

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

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

相关文章

挑选全身动作捕捉设备需要看哪几点?

随着数字化发展,虚拟数字人成为企业、品牌营销中不可或缺的一环,虚拟数字人可以通过全身动作捕捉设备,能够打破次元壁与用户实时互动。那要怎么挑选全身动作捕捉设备呢? 广州虚拟动力推出了旗舰版惯性动捕设备DreamsCap X1&#…

洗地机是智商税吗?2024洗地机品牌推荐

为了更加便捷地应对家务,人们一直在不断发明各种工具。从最早的扫把和拖布,到后来的吸尘器和扫地机器人,我们的家务清洁方式不断演进。然而,在最近几年,洗地机的出现彻底改变了我们的家庭清洁体验,为我们带…

微服务自动化docker-compose

一、docker-compose介绍 Docker Compose是一个用来定义和运行多个复杂应用的Docker编排工具。例如,一个使用Docker容器的微服务项目,通常由多个容器应用组成。那么部署时如何快速启动各个微服务呢,一个个手动启动?假如有上百个微服…

安卓(雷电)模拟器清除屏幕密码[亲测可用]

1、设置磁盘可写 启动模拟器,然后在模拟器的设置界面,设置磁盘共享为可写入,重启模拟器,如下图: 2、找到模拟器目录 返回桌面,右键模拟器图标,打开文件所在目录,如下图&#xff1a…

一天一个设计模式---适配器模式

概念 适配器模式是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的接口之间进行协同工作,使得原本由于接口不匹配而无法合作的类能够一起工作。 具体内容 适配器模式主要包括以下几个要素: 目标接…

Maven_下载_安装_配置

文章参考:https://zhuanlan.zhihu.com/p/615382243 Maven简介 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、测试、打包和发布等工作。 maven优点:…

呼吸道病毒感染后,为何会引发细菌性肺炎?气道和肠道微生物组改变是关键

谷禾健康 病毒-细菌合并或继发感染 引起呼吸道感染的病毒是导致全世界高发病率和死亡率的原因,数十年来通常发生在冬季。在冬天,空气干燥,那些可能含有病毒的飞沫可以在空气中停留更长时间,并可以进一步传播。此外人的免疫力在冬季…

[Markdown] Markdown常用快捷键分类汇总

文章目录 Markdown1、标题2、列表3、强调4、链接和图片5、代码和公式6、表格和任务列表7、引用8、分割线9、脚注10、目录11、注释12、定义 Markdown Markdown是一种轻量级的标记语言,可以让你用简单的语法来编写格式丰富的文档。 Markdown编辑器是一种专门用于编辑…

连接打印机显示“0x0000011b”错误代码,亲测有效的解决办法

程序代码园发文地址:null小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,连接打印机显示“0x0000011b”错误代码,亲测有效的解决办法http://www.byqws.com/blog/2142.html 最近办公室共享打印机突然打印不了,把之前连接的打印…

数字图像线性滤波——方框、均值、高斯滤波及opencv(C++)实现示例

数字图像线性滤波——方框、均值、高斯滤波及opencv(C)实现示例 一、图像滤波概念简介二、方框滤波及opencv实现示例1、方框滤波的公式2、opencv方框滤波boxfilter()函数(1)函数介绍(2)opencv实现实例&…

怎样创建vue项目(分别基于vue-cli和vite两种的创建方式)

一、基于vue-cli脚手架创建 1、安装node.js 1、首先需要安装node.js,推荐下载地址:Node.js 2、检查是否安装成功,使用打开黑窗口的快捷键windowR,输入cmd,在黑窗口输入node -v,如果输出版本号&#xff0…

LeNet-5(用于手写体字符识别)

结构:输入的二维图像,先经过两次卷积层到池化层,再经过全连接层,最后使用softmax分类作为输出层 每层有多个Feature Map(每个Feature Map有多个神经元) Feature Map通过一种卷积滤波器提取输入的一种特征 …

19. 从零用Rust编写正反向代理, 配置数据的热更新原理及实现

wmproxy wmproxy是由Rust编写,已实现http/https代理,socks5代理, 反向代理,静态文件服务器,内网穿透,配置热更新等, 后续将实现websocket代理等,同时会将实现过程分享出来&#xff…

vue3.2引用unplugin-vue-components插入,解放开发中import组件

目录 前言引用unplugin-vue-components插件的优缺点优点缺点 unplugin-vue-components插件引入安装插件配置vite配置更新TypeScript配置使用代码位置 总结Q&A 前言 unplugin-vue-components是一个用于Vue.js项目的插件,特别适用于Vite和Webpack构建工具。它的主…

区块链是怎么存储数据的?

每个块都是有大小限制的新的数据存储单元,当前数据不到上限,那么都可以添加进块。当前数据达到了上限,那么就得分表/分块,超限的那部分数据就需要等待下个区块存储 存储的数据:和mysql一样,文本数据直接存储…

【ceph】在虚拟环境中需要给osd所在的虚拟盘扩容操作

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

CAD点划线如何绘制?

CAD作为一款专业的制图软件,应用范围非常广泛,在所有需要精准数据的行业都会用到它。其中,公路交通工程等行业应用CAD软件是最多的,而且在这些行业中CAD软件中的线段应用也是最广泛的,其中的点划线在公路设计中用的是最…

MySQL一主一从读写分离

​ MySQL主从复制 一、主从复制概念 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从服务器中,然后在从服务器上对这些日志重新执行也叫重做,从而使得从数据库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行赋值,从…

恒通未来-大数据传输中的WDM解决方案

DWDM的出现是光纤传输技术发展中最新的重要现象之一。本教程将介绍DWDM技术的基本原理,如组件、DWDM系统中使用的光放大器等。 组件和操作: DWDM是光传输网络中的一种核心技术。DWDM的基本组件可以根据其在系统中的位置进行分类。在发射方面&#xff0…

ChatGPT:人工智能与人类交流的桥梁

在人工智能的浪潮中,ChatGPT以其独特的交流能力成为了一个亮点。作为一个基于强大的GPT-4模型的聊天机器人,ChatGPT不仅仅是技术的展示,它更是人工智能与人类交流的桥梁。 人工智能的语言理解革命 ChatGPT的出现标志着人工智能在语言理解和…