系列一、堆里面的分区:Eden、From、To、老年代各自的特点

news2024/11/18 21:24:49

一、堆里面的分区:Eden、From、To、老年代各自的特点

        堆是对象共享的区域,也是垃圾回收器主要工作的地方。主要分为新生区、养老区和元空间,而这三块地方中GC主要工作在新生区和养老区,其中新生区占1/3、养老区占2/3,新生区又分为伊甸区和幸存者区,幸存者区又分为幸存者0区(From区),幸存者1区(to区),内存所占比例是8:1:1。垃圾回收主要有四大算法,分别是:1、引用计数器法  2、复制算法   
3、标记清除算法  4、标记压缩算法。
 
1、引用计数器法:
     工作原理:每次对对象的引用都维护一个计数器,当该对象的计数器为0的时候,说明没有引用指向该对象了,GC可以对该对象的内存空间进行回收了。
     缺点:(1)较难处理循环引用;
               (2)每次对对象的引用都需要维护引用计数器,且维护计数器本身也有一定的消耗;
 
2、复制算法:
     工作原理:首先,当伊甸区满的时候会第一次触发GC,把还活着的对象拷贝到From区,当伊甸区再次满的时候,第二次触发GC,这时候GC会扫描伊甸区+From区,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区,同时把这些对象的年龄+1。
     备注:如果有对象的年龄到达了老年的标准,则复制到老年代区。   
 
     其次,清空伊甸区和From区中的对象。经过这次清空之后,原本的From区里边为空,变为了To区
     最后,To区和From区互换,原来的To区成为下一次GC时的From区。
     优点:不会产生内存碎片;
     缺点:GC第二次扫描拷贝存活的对象时,会导致内存减半
 
 
3、标记清除算法:
     标记清除一般发生在老年代。分为2个阶段:先标记出要回收的对象,然后统一回收这些对象。
     同通俗的话解释一下标记清除算法,是指程序运行期间,若可以使用的内存即将被耗尽时,GC线程将会被触发并将程序暂停,随后将要清除的对象标记一遍,最终统一回收这些对象,完成标记清理工作接下来便让应用程序恢复运行。
     
     两个阶段  
     标记:从引用根节点开始标记遍历所有的GC Roots,先标记出要回收的对象;
     清除:遍历整个堆,把标记的对象清除;
 
     缺点:此算法需要暂停整个应用,会产生内存碎片。
     
 
4、标记压缩算法:
     在整理压缩阶段,不再对标记的对象回收,而是将所有存活着的对象都向一端移动,然后直接清除边界以外的内存。可以看到标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存将会被整理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。
     优点:标记压缩算法不仅可以弥补标记清除算法中,内存区域分散的特点,也消除了复制算法当中,内存减半的高额代价。
     缺点:比复制算法多了一个标记的阶段,又比标记/清除多了一个整理内存的过程。

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

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

相关文章

airlearning-ue4安装的踩坑记录

最近要安装airlearning-ue4,用于实现无人机仿真环境,该项目地址为:GitHub - harvard-edge/airlearning-ue4: Environment Generator for Air Learning Project. This version is build on top of UE4 game engine 由于这个项目已经完成好几年…

Ubuntu20.04 安装微信 【deepin-wine方式极简安装】推荐,两行命令就解决了。

参考git仓库地址: GitHub - zq1997/deepin-wine: 【deepin源移植】Debian/Ubuntu上最快的QQ/微信安装方式【deepin源移植】Debian/Ubuntu上最快的QQ/微信安装方式. Contribute to zq1997/deepin-wine development by creating an account on GitHub.https://github.com/zq199…

项目全生命周期阶段检查单

项目全生命周期阶段检查单 1、立项阶段 2、计划阶段 3、需求阶段 4、设计阶段 5、编码集成阶段 6、测试阶段 7、交付阶段 8、结项阶段

PyTorch微调权威指南3:使用数据增强

如果你曾经参与过 PyTorch 模型的微调,可能会遇到 PyTorch 的内置变换函数,这使得数据增强变得轻而易举。 即使你之前没有使用过这些功能,也不必担心。 在本文中,我们将深入研究 PyTorch 变换换函数的世界。 我们将探索你可以使用…

【计算机毕业设计】Springboot 社区助老志愿服务系统-96682, 免费送源码,【开题选题+程序定制+论文书写+答辩ppt书写-原创定制程序】

Springboot 社区助老志愿服务系统 摘要 大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在图书馆管理的要求下,开发…

【Linux】C文件系统详解(三)——如何理解缓冲区以及自主封装一个文件接口

文章目录 如何理解缓冲区现象概念:文件缓冲区为什么要有缓冲区缓冲区在哪里 自己封装一个简单的文件接口自主封装目标 代码关于缓冲区强制刷新内核 关于字符串格式化函数printf和scanf函数 如何理解缓冲区 以前写过一个进度条, 有一个输出缓冲区->这个缓冲区在哪里,为什么要…

五、Linux目录结构

1.基本介绍 1.Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"r/",然后在此目录下再创建其他的目录。 2.深刻理解linux树状文件目录是非常重要的 3.记住一句经典的话:在Linux世界里,一切皆文件…

9、传统计算机视觉 —— 边缘检测

本节介绍一种利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测? 边缘检测是通过一些算法来识别图像中物体之间,或者物体与背景之间的边界,也就是边缘。 边缘通常是图像中灰度变化显著的地方,标志着不同区域的分界线。 在一张图像中,边缘可以是物体的…

机器学习---初识贝叶斯分类器

1. 引入问题 有两个可选的假设:病人有癌症、病人无癌症,可用数据来自化验结果:正和负- 有先验知识:在所有人口中,患病率是0.008,对确实有病的患者的化验准确率为98%,对确实无 病的患者的化验…

远程炼丹教程

【精选】深度学习远程炼丹:一文离线完成ubuntudockerpycharm环境配置_不能联网的电脑如何用docker配置深度学习环境_Yunlord的博客-CSDN博客文章浏览阅读2.6k次,点赞8次,收藏10次。本文详细讲解如何在离线服务器中安装dockerpycharm的远程深度…

Janus: 基于eBPF的5G实时AI控制器

O-RAN定义的RIC模型并不能很好支持对实时性有很高要求的用例,本文定义了一套基于eBPF的内联执行架构,从而可以将RIC的支持扩展到实时场景。原文: Taking 5G RAN Analytics and Control to a New Level[1] 摘要 Open RAN为5G无线接入网(RAN)引入了模块化和…

亚马逊Lightsail:云服务新篇章,轻松开启您的数字未来

文章目录 前言一、Lightsail是什么?Lightsail的优势使用场景 二、AWS lightsail创建VPS总结 前言 对于开发者而言,当你想构建系统架构时,你的面前就出现了两种选择,选择一是花时间去亲手挑选每个亚马逊云科技组件(云服…

PS学习笔记——移动工具

文章目录 介绍文档内移动文档间移动 介绍 移动工具:用于移动图层中的对象,并且同一图层中的所有对象都将一起移动 选中移动工具后,选项栏中会出现“显示变换控件”,勾选后即可看见图层中的对象周围出现边框,可以进行缩…

【Go学习之 go mod】gomod小白入门,在github上发布自己的项目(项目初始化、项目发布、项目版本升级等)

参考 Go语言基础之包 | 李文周的博客Go mod的使用、发布、升级 | weiGo Module如何发布v2及以上版本1.2.7. go mod命令 — 新溪-gordon V1.7.9 文档golang go 包管理工具 go mod的详细介绍-腾讯云开发者社区-腾讯云Go Mod 常见错误的原因 | walker的博客 项目案例 oceanweav…

山西电力市场日前价格预测【2023-11-20】

日前价格预测 预测说明: 如上图所示,预测明日(2023-11-20)山西电力市场全天平均日前电价为255.39元/MWh。其中,最高日前电价为436.50元/MWh,预计出现在18:00。最低日前电价为21.61元/MWh,预计出…

如何查看 class 文件的编译器版本

文章目录 原理分析解决方案其它解决方案javap 命令行工具 在平时的 Java 开发中,有时候我们需要知道某个 class 文件是由哪个版本的 Java 编译器编译生成的 原理分析 class 文件,即字节码文件,它有特定的二进制格式,这种格式是由…

『力扣刷题本』:环形链表(判断链表是否有环)

一、题目 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&am…

接口调用微信公众号群发功能,绕过微信自身限制

微信群发功能要求要微信认证。微信认证要求要企业账号、而且需要认证费用。 本篇文章教大家非微信认证账号如何群发公众号信息 本篇文章基于python语言开发,其他的语言一样的方式,不需要拘泥于语言 注意事项: 要求有微信公众平台登陆状态,也就是Cookie数据, 如何通过Py…

统信UOS通过源码安装软件提示“configure: error: cannot run C compiled programs.”错误

1. 问题说明 使用源码的方式安装git软件,安装过程中出现两个错误。 编译错误“cannot run C compiled programs” XC:~/Downloads/git-2.42.1$ ./configure --prefix/home/software/git-2.42.1 configure: Setting lib to lib (the default) configure: Will try…