JVM java主流的追踪式垃圾收集器

news2024/11/14 3:59:40

目录

前言

分代垃圾收集理论

标记清除算法

标记复制算法 

标记整理法        


前言

        从对象消亡的角度出发, 垃圾回收器可以分为引用计数式垃圾收集和追踪式垃圾收集两大类, 但是java主流的一般是追踪式的垃圾收集器, 因此我们重点讲解. 

分代垃圾收集理论

        分代收集这种理论其实就是在说两件事: 

  1. 绝大多数的对象都是朝生夕灭
  2. 熬过多次GC的对象就越是难以消亡

        这两个理论将java的堆区划分为了不同的区域, 难以消亡的对象放在一起, 形成类似于老年代这种的内存区域, 这样的内存区域, 垃圾回收的频率小, 存活的对象数量占比整个老年代高.  然后把那些熬不过垃圾回收的放在一起, 然后标记其中少了不需要回收的对象, 然后将其余的回收即可. 通过这种分代的设计, 其实就可以给不同的内存区域以合适的GC频率. 来较低由垃圾回收器带来的性能消耗和空间的消耗.

        分了代之后, 垃圾回收器就可以根据不同的年龄代的内存区域进行独立的回收, 例如可以单独对年龄小的类对象进行回收, 老年代的可以稍后或者在需要的时候进行回收. 

        在商用的java里面, 设计者至少会将java堆区分为两个年代的区域: 新生代, 老年代: 

  1. 新生代: 对象朝生夕灭, 存活概率低, 这个区域每次GC都有大量的对象死去, 存活下来的才有机会进入老年代
  2. 老年代: 对象的存活几率大, 每次GC都有大量的对象存活. 

        但是分代收集也并非只是简单的对一个内存区域根据对象的存活概率来进行划分, 还需要考虑很多额外的事情, 例如老年代中可能会存在对象依赖新生代中的对象, 因此其实你无法直接清理掉新生代中某些已经被老年代中的对象引用的对象. 你必须查看老年代, 看有没有对象引用它. 

        遍历整个老年代无疑是给系统增加了非常多的负担, 但是其实实际上, 老年代中引用新生代中的对象的例子很少, 并且一般情况下, 如果新生代中的对象死亡, 那么依赖这个新生代对象的老年代中的对象, 也应该跟它一样倾向于死亡. 

        如果新生代中的对象 , 因为老年代中对象的引用导致这个对象一只没有被GC, 那么就会慢慢升级到老年代, 以至于和同尊级别相同, 都为老年代. 跨时代的引用就消失了. 

        在实际上跨代引用的对象其实很少,  因此我们只需要特别标记出一块特别的内存区域, 用来表示这个区域里面的年龄大的对象是具有新生代对象引用的对象, 然后在进行回收新生代的时候, 只需要在一小块的老年代内存中查找是否具有新生代引用的对象即可. 

        再细一点, 你可以将老年代划分为多个内存区域, 然后标记处那些具有新生代引用的内存区域, 扫描的时候, 也只需要扫描那些具有标记的内存区域即可, 但是在扫描的过程中, 可能会出现一种情况, 那就是扫描的时候需要维护数据的正确性, 也就是保证扫描的时候,, 其引用被修改了, 例如扫描之前一个老年代对象本来是引用了一个新生代的对象, 但是这个新生代对象在扫描其老年代的时候, 这个老年代的对象引用了另外一个对象, 而不是当前需要扫描其老年代引用的对象. 


标记清除算法

        最基础的垃圾收集算法, 简单来说就是先标记出所有的需要回收的对象, 然后在清理阶段, 清理掉被标记的对象, 反之亦可. 好处就是逻辑简单, 不需要修改修改其他地方对没有被回收对象的引用. 

        其算法的思路逻辑简单, 但是有一个缺点, 那就是不稳定, 你永远不能保证, 你所标记的对象只是少数, 在大量的对象被标记并需要被回收的时候, 会导致标记和执行的效率会非常慢, 第二个是如图所示, 因为对象是直接清除, 而不是将空闲的内存整理到一边, 被使用的内存整理到另外一边, 因此内存会出现很多碎片, 

        如果由于过多的碎片, 导致新建的对象无法找出一块足够大小的连续的内存, 就又不得不触发一次GC, 但是再一次GC之后会不会出现足够大的能容下新对象的内存, 还是个未知数 ... 



标记复制算法 

        简称复制算法, 核心思路就是 将一个内存划为两块大小相同的空间, 在一次GC之前, 只是用其中的一块, 用到差不多了的时候, 需要GC了, 就以此找出里面没有被标记需要回收的对象, 然后将其规整的复制到另外一边, 避免了其内存碎片的产生, 然后复制完之后, 直接就可以清理掉被复制的那块内存, 然后新建对象就可以在规整的内存的那一边进行创建. 

         只要是标记, 就要关注被标记为需要回收的对象的数量, 如果数量太多, 依然会因为标记和清理而影响性能, 同时如果大量对象都是存活的话, 还需要将大量的对象都复制到内存的另外一边, 这就额外造成了性能的消耗. 同时移动对象的内存地址之后, 还需要去修改引用其对象的局部变量或则好常量等.   而且可用的空间, 被缩小了一半. 

        但是这种方法避免的内存碎片的产生.

        但是实际情况确实, 每次回收其实只有少部分对象存活, 例如100个对象中, 一次GC后可能只剩下了10个对象左右, 保守一点, 我们可以将内存区域的划分为 8 : 2, 也就是每次新建的时候, 将新生代分为两部分, 新建的对象都在8这个占比的区域中, 然后等要到了GC的时候, 就将存活的对象规整的复制到2成内存占比的空间中, 修改引用地址之后, 直接将8成的内存空间直接释放掉即可.

        有的也可以将内存划为3块, 一块占比为80%, 另外两块分别占比10%, 我们分配内存, 只在80%和一块10%内存占比的区域中分配内存, 然后要GC的时候, 就将GC存活的对象一次性复制到另外一块10%内存占比的区域中

        无论是什么情况, 你都需要考虑一件事情, 那就是你无法保证, 每次存活的对象都占总对象的0~20%, 因此如果存活的对象, 大于小内存占比内存区域的可用空间的话, 就需要进行内存补偿,让其有足够的内存来分配, 例如老年代. 也就是说如果由于存货的对象过多, 存不下, 就可以将这些存活的对象一部分让其进入老年代进行存储.



标记整理法        

        标记复制算法在对象存活的数量过多的时候, 会存在复制效率过低的情况, 同时你会白白浪费一半左右的空间, 如果你不想浪费这一半的空间, 使用2 8 分的情况, 就需要为小内存进行内存补偿. 

        而标记整理法综合了标记清除算法和复制算法的优点: 

        首先, 对内存中需要回收的对象进行标记, 然后将存活对象移动到内存的一边, 然后直接清除掉存活的内存对象所占区域的区域

        缺点很明显, 需要移动对象, 如果移动对象数量过多, 那么就将会存为一种负担, 移动的存活对象还需要及时更新引用, 并且在移动和更新完成之前, 你不能使用它. 但是不考虑移动, 直接清理就会产生空间碎片化的情况. 但是如果完全不整理内存的碎片, 那么就需要引入类似于win10的内存分配器来解决碎片问题, 

        还有一种方式就是我没必要一上来就使用标记整理, 我可以在内存足够的时候, 先使用性能高, 代价小的标记清除算法, 然后后续再因为内存不够而分配失败 , 那么就进行整理, 将内存整理到一起,这样就完美的避开了他们的缺点.

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

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

相关文章

腾讯云负载均衡ssl漏洞(CVE-201602183)解决

绿盟漏洞扫描腾讯云应用,提示有1个高危、1个中危。 看IP是应用服务器前端的负载均衡。 漏洞详细信息如下: 根据腾讯云文档,可以通过设置负载均衡加密算法设置,来缓解漏洞风险。 登录 负载均衡控制台,在左侧导航栏单击…

宸励投资专注高新技术投资,助推中小企业快速发展

宸励投资,作为一家新兴的互联网式新轻创型投行公司,专注在人工智能、专精特新及数字化美业三大板块领域,展现了其深厚的专业背景和卓越的引领能力。这家公司不仅在各自的领域内深耕细作,更通过其前瞻性的视角和独到的战略布局&…

Windows X86 远线程注入问题解惑

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

ProtoBuf介绍及安装

文章目录 序列反序列化ProtoBuf特点安装ProtoBufwindowsUbuntuCentos 序列反序列化 在网络传输过程当中,可以理解为: 发送方接收方 它们彼此要通信,先要定好一个规则,也就是协议,双方都能认识的结构化数据&#xff…

Linux C——网络编程

本案例运行环境:Ubuntu 12.04.1 LTS 1、基本概念 网络的七层模型: 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 其中:1、2、3层主要面向通过网络端到端的数据流, 4、5、6、7层定义了程序的功能 …

静态链接和动态链接的Golang二进制文件

关注TechLead,复旦博士,分享云服务领域全维度开发技术。拥有10年互联网服务架构、AI产品研发经验、团队管理经验,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,阿里云认…

李沐 模型选择、过拟合和欠拟合相关代码【动手学深度学习v2】

多项式回归 生成数据集 给定x,我们将使用以下三阶多项式来生成训练和测试数据的标签: y=5+1.2x−3.4+5.6+ϵ where ϵ∼( ). 噪声项ϵ服从均值为0且标准差为0.1的正态分布。 在优化

GraphRAG与VectorRAG我都选:HybridRAG

从金融应用中产生的非结构化文本数据(如财报电话会议记录)提取和解释复杂信息,即使采用当前最佳实践使用检索增强生成(RAG)技术,对于大型语言模型(LLMs)来说仍存在重大挑战。这些挑战…

【游戏党必看】2024年最适合玩游戏的电脑系统推荐!

许多玩家都在问如果在电脑上玩游戏装什么系统好呢?以下系统之家小编给大家推荐两款专门为游戏玩家打造的操作系统,针对大型游戏进行了深度优化,显著提升了系统性能,确保游戏运行更为流畅无阻,能完美兼容各种类型的游戏…

三好夫人|最强“逼”婚神器,送完一次就领证

三好夫人|揭秘最强“逼”婚神器,让你的爱情甜蜜升级,速领见家长通行证! 男人们请记住,如果一个女生给你送三好夫人,那么你赶快带她见家长把婚事定了。 在这个快节奏的时代,爱情似乎也被按下了快…

基于51单片机的电机控制和角度检测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用滑动变阻器连接ADC0832数模转换器模拟角度传感器,然后通过LCD1602显示数值,然后按键按下不动,电机正转,松开停止。第二…

显示和隐藏图片【JavaScript】

使用 JavaScript 来实现显示和隐藏图片。下面是一个简单的示例&#xff0c;展示如何通过按钮点击来切换图片的可见性。 实现效果: 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name&…

神奇的交互!Ethernet IP转Profinet网关与发那科机器人的数据交互

在当今的工业领域&#xff0c;随着自动化程度的不断提高&#xff0c;工业化升级已成为必然趋势。在这个过程中&#xff0c;对机器人的联网需求变得日益迫切。机器人作为工业生产中的重要组成部分&#xff0c;其高效运行和与其他设备的协同工作对于提高生产效率至关重要。然而&a…

EI-Bisynch协议

EI-Bisynch&#xff08;Extended Interface-Bisynchronous&#xff09;协议是一种早期用于设备通信的协议&#xff0c;主要用于工业控制系统中的串行通信。随着技术的发展&#xff0c;EI-Bisynch的使用已经大幅减少&#xff0c;逐渐被更现代化、灵活性更高的通信协议&#xff0…

【Linux】手把手教你制作一个简易shell——(进程创建fork进程替换wait与进程等待exec的应用)(自定义shell程序设计)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

华为昇腾智算中心-智算中心测试方案与标准

本方案是企业内训课程《华为昇腾智算中心深度技术研修》的一部分授课课件的样例。方案内容中详细阐述了华为昇腾环境下智算中心的测试方案和标准&#xff0c;以确保硬件和软件系统在实际部署和运行中的高效性和稳定性。主要内容包括集群硬件清单、节点拓扑配置以及环境配置。硬…

企业微信oauth2的code换用户身份一直40029解决方案

序&#xff1a; 雪狼的微信表情包&#xff0c;欢迎下载【程序员雪狼】微信表情 - 来自微信表情商店&#xff0c;扫二维码下载表情 正文&#xff1a; 雪狼在用oauth2返回的code要去请求getuserinfo3rd接口的时候&#xff0c;报错如下40029 一样&#xff0c;肝了一天&#xff0c…

本地部署高颜值某抑云音乐播放器Splayer并实现无公网IP远程听歌

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

湖北建筑类初级职称申报的全方位解读

湖北建筑类初级职称申报的全方位解读 湖北工程行业助理工程师/初级职称申报评审 湖北建筑类助理工程师/初级职称正常申报目前都是电子版证书&#xff0c;湖北省政务服务网查询生成&#xff0c;省网查询&#xff0c;后期都会同步G网查询。 湖北建筑类助理工程师纸质版 1.之前申…

kubernetes网络(一)之calico详解

摘要 本文介绍Kubernetes最流行的网络解决方案calico。 kubernetes中不同宿主上的pod需要相互通信&#xff0c;如果按TCP/IP协议分层进行分类&#xff1a; 二层方案&#xff1a;flannel的udp和vxlan模式 三层方案&#xff1a;flannel的host-gw模式&#xff1b;calico的IPIP模…