当前位置: 首页 > news >正文

GC — 垃圾收集算法

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

作为学习笔记,记录一下JVM常见的几种垃圾收集算法。

1. 复制算法(Copying)

  • 思路
            将可用的内存划分为大小相等的两块,每次只使用其中的一块,当这一块内存使用完了,就将存活的对象复制到另一块,然后整个清理已使用过的那一块内存。如下图所示:
    223614_EvMB_2842105.png
  • 不足
            完全浪费了一半的内存空间!
  • 改进
            
    现代商业虚拟机都用复制算法来回收新生代
            由于新生代中98%的对象都是“朝生夕死”的,所以可以将内存划分为一块较大的Eden空间和两块较小的Survivor空间。
            每次使用Eden和其中一块Survivor空间来存储,当这两块空间存储满时,就将活着的对象一次性复制到另外一块Survivor中,最后清理掉之前的Eden和Survivor空间。
            HotSpot虚拟机默认Eden和Survivor的大小比例是8:1。
            如果遇到另一块Survivor空间内存不足时(不足以存放上一次新生代收集下的存活对象),这时,就通过分配担保机制使对象直接进入老年代。

 

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

  • 思路
            首先标记出所有要回收的对象,在标记完成后,统一回收所有被标记的对象。
    223512_sQev_2842105.png
  • 不足
           效率不高。
           会产生大量的内存碎片,浪费空间。

 

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

    对第二个标记-清除算法的改进。

  • 思路
            首先标记所有要回收的对象,让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
    223719_jUFm_2842105.png
  • 不足
            速度较慢。

 

4. 分代收集算法(Generational Collection)

    新生代采用“复制算法”,老年代采用“标记-清除”或“标记-整理”算法。

 

彩蛋

  • 并发垃圾收集器(CMS)为什么没有采用标记-整理算法来实现?
  • HotSpot的算法实现
    枚举根节点 - 通过OopMap提前存储对象的偏移量、哪些位置是引用等信息。
    安全点 - “是否具有让程序长时间执行的特征”。如:方法调用、循环跳转、异常跳转等,OopMap只记录安全点。采用“主动式中断”,使线程跑到安全点。
    安全区域 - 一段代码片段中,引用关系不会发生变化。

 

注:以上三个图片不是小王绘制,是从另一篇博客(关于JVM的几个垃圾收集算法思想)中拷贝过来的。

 

转载于:https://my.oschina.net/xiaowangqiongyou/blog/1543320

相关文章:

  • Bloglines手机伴侣支持走cmwap代理了
  • 页面每两秒刷新一次时间(java web)
  • 搭建LNMP中遇到PHP只能下载无法打开的处理
  • 为什么要用深度学习来做个性化推荐 CTR 预估
  • Win2008R2修改远程桌面端口
  • DateUtils时间的封装
  • 数学口袋精灵bug的发现及单元测试
  • 用fail2ban阻止ssh暴力破解root密码
  • Centos 下面升级系统内核(转)
  • 两个二进制数求和
  • magento 货币换算
  • iOS -- tableView顶部留白
  • C链表的简单案例
  • Java与面向对象设计
  • TCP与UDP的区别
  • [deviceone开发]-do_Webview的基本示例
  • 0x05 Python数据分析,Anaconda八斩刀
  • github指令
  • HashMap剖析之内部结构
  • JavaScript 基本功--面试宝典
  • learning koa2.x
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Node + FFmpeg 实现Canvas动画导出视频
  • Otto开发初探——微服务依赖管理新利器
  • Python爬虫--- 1.3 BS4库的解析器
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 大整数乘法-表格法
  • 对超线程几个不同角度的解释
  • 回顾2016
  • 将回调地狱按在地上摩擦的Promise
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 一些关于Rust在2019年的思考
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 智能合约Solidity教程-事件和日志(一)
  • 你对linux中grep命令知道多少?
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #1014 : Trie树
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (3)(3.5) 遥测无线电区域条例
  • (done) 两个矩阵 “相似” 是什么意思?
  • (LeetCode) T14. Longest Common Prefix
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转)原始图像数据和PDF中的图像数据
  • ***检测工具之RKHunter AIDE
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET序列化 serializable,反序列化
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken