前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )

【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )

作者头像
韩曙亮
发布2023-03-29 16:25:45
5480
发布2023-03-29 16:25:45
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

总结

常用的垃圾回收算法 :

  • 标记-清除算法 ;
  • 复制算法 ;
  • 标记-整理算法 ;

这些算法没有好坏优劣之分 , 都有各自的 优势 和 弊端 , 都有各自的 使用场景 ; 一般的垃圾回收 , 都是几种垃圾回收算法结合起来一起使用 , 不同的场景下 , 使用不同的垃圾回收算法 ;

分代收集算法 : 该垃圾回收算法不是特定的回收算法 , 而是 合理地使用上述

3

个算法 , 在 不同的内存空间内 , 使用不同的垃圾收集器 ;

这里的分代 指的是 年轻代 , 老年代 ; 年轻代又分为 Eden 和 Survivor 两个区域 , Survivor 又分为 From 和 To 两个区域 ;

一、标记-清除算法


堆 内的内存区域如下 , 内存区域分为一个个内存块 , 某个对象可能占用

2

个内存块 , 也能占用若干个内存块 ;

如果 定位 找到了 垃圾对象 , 那么 将该 垃圾对象 进行标记 , 如下图 , 标记为 橙色 ;

标记好之后 , 在执行 GC 内存回收时 , 会 将 被标记的 内存 回收 ;

在这里插入图片描述
在这里插入图片描述

标记-清除算法优缺点 :

  • 优点 : 算法 实现简单;
  • 缺点 : 产生了很多 不连续的内存 , 如果对象比较大 , 要用
5

个内存块 , 会出现 OOM ;

二、复制算法


将 内存区域 , 分为两部分 ;

对象只放在 左侧区域 , 右侧区域 空着 ;

左侧区域 的 垃圾对象 回收后 , 将 存活 的对象 , 拷贝到 右侧区域 中 ;

在这里插入图片描述
在这里插入图片描述

复制算法优缺点 :

  • 优点 : 解决了 内存碎片 问题 ; 效率高 ;
  • 缺点 : 只能使用 一半内存 ;

复制算法 适合使用 内存量较小 , 但是 操作很频繁的区域 , 如 : 在 年轻代 的 Survivor 中 , 使用的就是 复制算法 垃圾回收机制 ;

三、标记-整理算法


标记-整理算法 是 标记-清除算法 的更完善的版本 , 标记-整理算法 解决了 内存碎片问题 ;

内存回收后 , 将内存中的对象重新 紧密地 排列 , 消除内存碎片 ;

在这里插入图片描述
在这里插入图片描述

标记-整理算法 优缺点 :

  • 优点 : 消除了内存碎片 ;
  • 缺点 : 性能较低 ; 执行该垃圾回收算法时 , 需要 对内存进行重排 , 此时不能随意变动内存的数据结构 , 因此 执行该 标记-整理算法 时 , 整个线程需要整体停下来 , 但这样大大影响程序的执行效率 ;

标记-整理 算法 , 不能用在 内存操作 活跃的场景中 , 如 : 老年代的垃圾回收 , 使用的是 标记-整理 算法 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 总结
  • 一、标记-清除算法
  • 二、复制算法
  • 三、标记-整理算法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档