`
liyuzhel312
  • 浏览: 6144 次
社区版块
存档分类
最新评论

关于Jvm垃圾回收的总结

 
阅读更多
这是第一次写东西,有什么不对的地方请大家指教,
这篇是对周志明老师的那本书有关Jvm垃圾收集器的总结
1.对象已死
    引用计数
    根搜索
    判断对象是否已死亡需要进行两次标记
 

 
2.垃圾收集算法
    标记-清除:标记需要回收的对象,然后进行清除,这个效率不高,也容易产生内存碎片
    复制算法:就是把内存分块(可以按不同的比例),两块儿中始终有一块儿为空,当一块儿满了之后,把存活的对象复制到另一块,死亡的对象进行清除,这个理念也就产生了HotPot的eden与survivor之分了(老年代一般都不用这个算法)
    标记-整理:让活着的对象向内存的一端移动,剩余死亡的对象清除
    分代收集算法:分为老年代与年轻代,这个算法只是提出了一个分代理念,具体的收集还是需要以上三个或者是其他的算法
 
3.垃圾收集器:如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现
    其中sun公司的Hotspot主要又一下几种垃圾收集器
    年轻代:Serial   ParNew    ParallelScavenge 
    老年代:CMS(1,2,5)   Serial Old(MSC)(1,2,3,4)  ParallelOld(3)
    还有一个G1收集器,这个是最新的垃圾收集器
    这是各个收集器搭配示意图
    

 
 
    一下是各个收集器详细的介绍:
        Serial收集器是一个古老的单线程收集器,他在收集垃圾的时候会发生STW(Stop The World)现象,而且Serial/SerialOld使用的收集算法不同,前者使用的是复制算法,后者是标记整理算法,如下图所示


 
                    

 
他的优势就在于简单高效,没有线程交互的开销,只专注于垃圾回收,Serial收集器对于运行在Client模式下的虚拟机是一个很好的选择,其中如果在SerialOld在server模式下使用还有两个用途与ParallelScanvage配合使用,还可以做cms的预备方案,在Concurrent mode failure失败的时候使用。
        
        ParNew收集器是Serial收集器的多线程版本,除了使用多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所以控制参数、收集算法、STW、对象分配规则,回收策略与Serial收集器都完全一样,示意图如下:


 
 
他是许多server模式下的首选的新生代收集器,除了Serial收集器他是一个能与CMS搭配的收集器(Parallel不能与CMS搭配使用),他在单cpu的情况下并不比serial收集器的性能好,甚至双核的情况下页不比serial性能要好,但是随着cpu增加的情况下还是有优势的
 
        ParallelScanvage是一个新生代收集器,也是使用并行的多线程收集器,看上去都和ParNew都一样,但是他还有他的特别之处,
他与其他的关注点不一样,cms关注的是最少停顿时间,而他关注的是最大吞吐量(运行代码时间(系统运行时间)/垃圾收集时间+运行代码时间),停顿时间短是使用哪种交互场景,有良好的相应速度能够提高用户的使用体验,最大吞吐量是可以高效的利用cpu,最短的完成任务,尽快的完成任务,主要是应用到后台应用,而不需要太多的交互任务。他可以是用参数精确的控制吞吐量,他也被称为吞吐量优先收集器,他有一个参数UserAdativeSizePolicy,他可以控制GC自适应调整,不需要指定新生代大小,已经eden与survivor的比例,这种策略称为GC自适应调整策略,这也是与ParNew的区别之一
 
        ParallelOld收集器的产生主要是为了与ParallelScanvage配合使用,后者原来只能与Serialold使用,而前者出现后才是后者成为名副其实的吞吐量优先的收集器,在注重吞吐量与cpu敏感的场合,可优先使用ParallelOld与ParallelScanvage组合
 
        CMS收集器是已获取停顿时间最短的为目标收集器,他特别适合那种重视相应速度,希望停顿时间最短,给用户带来良好的体验,如互联网应用。全拼是 Concurrent Mark Sweep,该收集器使用的是标记-清除算法,他的工作过程主要有以下几步:
        初始标记(STW)
        并发标记
        重新标记(STW)
        并发清除
        初始标记与重新标记仍然会STW,初始标记只是标记GC ROOTS能标记到的对象,速度很快,重新标记为了修正并发标记的时间,因用户用户程序继续运作,而导致标记发生变化的那一部分进行标记(不是太理解),这个阶段比初始标记要长一些,但是远比并发标记要短。如下图所示


 
CMS并发收集,低停顿。但是他还有一些缺点:
    对CPU比较敏感,当CPU少于4个的时候,性能会下降很多,这是根据他的计算公式来决定的。
    无法收集浮动的垃圾,因为在并发清除的工程中,用户的程序仍然在进行,而收集器没有对这时候产生的垃圾进行标记,所以就产生了浮动的垃圾,因此CMS无法像其他收集器一样等老年代满了之后再运行,当内存达到一定比例的时候就会运行,默认的情况下达到68%的时候就会启动CMS,当应用的老年代的垃圾增长速度较慢,可以适当的挑高这个参数。当在运行的过程中,剩余的内存大小无法满足用户运行,就会发生Concurrent mode failure,这时候虚拟机就会启动预备方案Serial old来进行收集,这样停顿时间就会增大,当那个比例设置的较大的时候就会出现这种情况。
    由于CMS使用的是标记-清除算法,这种算法会产生大量的碎片,因此当内存无法为一个大的对象分配合理的内存,就会触发FULLGC,因此可以使用一个参数,当FULLGC过后,就会进行碎片整理,也可以设置另一个参数在经过多少次FullGC后进行碎片整理。
 
        G1收集器使用了标记-整理的算法,他不会产生碎片,而且可以精确的控制停顿时间,他能让使用者指定在M毫秒内,消耗垃圾时间不会大于N秒,这机会是实时Java(RTSJ)收集器的特征。G1收集器基本上是在不牺牲吞吐量的情况下完成低停顿的内存回收。这是由于G1极力避免全代的垃圾回收,只是回收部分区域。他将老年代与年轻代分为各种不同的区域,而且大小是独立固定的,并且跟踪区域中的垃圾堆积度,后台维护一个优先列表,每次根据运行的垃圾收集时间,来优先收集垃圾最多的区域,这就是G1的由来(Garbage First),这种区域划分以及划分优先级,可以保证G1在有限的时间内获得最高的收集效率。
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

分享到:
评论

相关推荐

    使用 Simulink(R) 在 AWGN 信道上执行带穿孔的软判决维特比解码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    极化码的高斯近似过程,基于matlab平台.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    广东省关于人工智能赋能千行百业的若干措施.docx

    广东省关于人工智能赋能千行百业的若干措施.docx

    湖北省数据条例(草案)(征求意见稿).docx

    湖北省数据条例(草案)(征求意见稿).docx

    CSS网站布局与开发技巧(pdf电子书)最新版本

    中软国际IT培训中心的培训教程,属于学习CSS网页设计的基础入门教程,讲一些原理和概念,高深的理论不太多。

    Python 中数据结构和算法的最少示例.zip

    Python Data Structures and Algorithms Minimal and clean example implementations of data structures and algorithms in Python 3. Contribute Thank you for your interest in contributing! There are many ways to contribute to the project. Start testing from here Take note when running all tests using unittest $ python3 -m unittest discover tests To run some specific tests you can do the following (e.g. sort) $ python3 -m unittest tests.test_sort Run all tests using pytest Make a note when $ python3 -m

    TeamIDE-win-2.6.31Team IDE 集成MySql、Oracle、金仓、达梦、神通等数据库、SSH、FTP、Redis、Zookeeper、Kafka、Elasticsearch、M

    TeamIDE-win-2.6.31Team IDE 集成MySql、Oracle、金仓、达梦、神通等数据库、SSH、FTP、Redis、Zookeeper、Kafka、Elasticsearch、M

    C/C++/Python/Java四种语言下的算法实现资源概览

    内容概要:本文综述了C、C++、Python、Java这四种主流编程语言中,用于实现常见和高级算法的学习资料,覆盖范围广泛,从书籍、在线课程平台到GitHub上的开源代码仓库均有提及。每种语言都详述了推荐的学习资源及其优势,旨在满足不同程度学习者的需要。 适合人群:对算法实现有兴趣的学生、自学爱好者、开发者等。 使用场景及目标:帮助读者挑选合适的语言和资源深入理解算法的理论与实际编码技巧,适用于个人提升、项目实践或教学使用。 其他说明:文章提供了丰富的学习渠道和实战项目,既适合作为基础理论的学习,也适合于实际操作练习,尤其强调通过实做加深理解的重要性。

    aiuiphone0000000000000000000

    aiuiphone0000000000000000000

    支持多场景回调开箱即用 原生仿百度登录验证.zip

    支持多场景回调开箱即用 原生仿百度登录验证.zip

    2023 年“泰迪杯”数据分析技能赛B题-企业财务数据分析与造假识别

    2023 年“泰迪杯”数据分析技能赛B题-企业财务数据分析与造假识别 完整代码

    Levenshtein Python C 扩展模块包含用于快速计算 Levenshtein 距离和字符串相似度的函数.zip

    Levenshtein Python C 扩展模块包含用于快速计算 Levenshtein 距离和字符串相似度的函数内容需要维护者介绍文档执照历史源代码作者需要维护者我 (Mikko Ohtamaa) 目前不维护此代码。我只是为了方便起见才将其拉到 Github 上的(之前在公共存储库中不可用)。因此,如果您提交了任何问题,我都不会调查。介绍Levenshtein Python C 扩展模块包含用于快速计算的函数Levenshtein(编辑)距离和编辑操作字符串相似度近似中位数字符串,以及一般字符串平均值字符串序列和集合相似度它同时支持普通字符串和 Unicode 字符串。需要 Python 2.2 或更新版本。StringMatcher.py 是一个基于 Levenshtein 构建的类似 SequenceMatcher 的示例类。它缺少一些 SequenceMatcher 的功能,但又有一些额外的功能。Levenshtein.c 也可以用作纯 C 库。您只需在编译时定义 NO_PYTHON 预处理器符号 (-DNO_PYTH

    基于OpenCV像素检测的Onmyoji游戏脚本

    基于OpenCV像素检测的Onmyoji游戏脚本

    机器人算法的 Python 示例代码 .zip

    Pythonbot高斯网格图射线投射网格图激光雷达至网格地图k-均值对象聚类矩形接头大满贯迭代最近点 (ICP) 匹配FastSLAM 1.0路径规划动态窗口方法基于网格的搜索Dijkstra 算法A* 算法D*算法D* Lite 算法位场算法基于网格的覆盖路径规划国家网格规划偏极采样车道采样概率路线图(PRM)规划快速探索随机树(RRT)回程时间*RRT* 和 reeds-shepp 路径LQR-RRT*五次多项式规划Reeds Shepp 规划基于LQR的路径规划Frenet 框架中的最佳轨迹路径追踪移动到姿势控制斯坦利控制后轮反馈控制线性二次调节器 (LQR) 速度和转向控制模型预测速度和转向控制采用 C-GMRES 的非线性模型预测控制手臂导航N关节臂对点控制带避障功能的手臂导航航空导航无人机三维轨迹跟踪火箭动力着陆双足动物倒立摆双

    可信任的企业4.0生态系统.pptx

    可信任的企业4.0生态系统.pptx

    C语言档案管理系统 代码完整

    学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,系统提供菜单方式作为人机界面并具有如下功能: 学生信息录入功能 学生信息浏览功能 按学号、姓名等进行查询、排序功能 2、要求界面简单明了;对输入的数据具有有效性检查能力,比如输入的成绩不在0~100之间,要求重新输入;

    原生js谷歌网页电吉他弹奏源码.rar

    原生js谷歌网页电吉他弹奏源码.rar

    原生js微信分享到朋友圈浮动层代码.zip

    原生js微信分享到朋友圈浮动层代码.zip

    第7章 聚类算法 - 作业 - 副本.ipynb

    第7章 聚类算法 - 作业 - 副本.ipynb

    AICon 2024全球人工智能开发与应用大会(脱敏)PPT合集(30份).zip

    AICon 2024全球人工智能开发与应用大会(脱敏)PPT合集,共30份。 AI辅助编程测评与企业实践 SmartEV和AI 蔚来的思考与实践 下一代 RAG 引擎的技术挑战与实现 书生万象大模型的技术演进与应用探索 人工智能行业数据集构建及模型训练方法实践周华 全方位评测神经网络模型的基础能力 千亿参数 LLM 的训练效率优化 向量化与文档解析技术加速大模型RAG应用落地 基于大模型的缺陷静态检查 多环境下的 LLM Agent 应用与增强 大模型在华为推荐场景中的探索和应用 大模型在推荐系统中的落地实践 大模型的异构计算和加速 大模型辅助需求代码开发 大语言模型在法律领域的应用探索 大语言模型在计算机视觉领域的应用 大语言模型的幻觉检测 小米大模型端侧部署落地探索 快手可图大模型的技术演进与应用探索 提升大模型知识密度,做高效的终端智能 电商大模型及搜索应用实践 百度大模型 原生安全构建之路 硅基流动高性能低成本的大模型推理云实践 语言模型驱动的软件工具思考:可解释与可溯源 长文本大模型推理实践:以 KVCache 为中心的分离式推理架构 阿里云 AI 搜索 RAG 大模型优

Global site tag (gtag.js) - Google Analytics