【JVM篇】垃圾回收算法

2023-10-27

目录

1、前言

2、标记-清除算法

3、标记-整理算法

4、标记-复制算法

5、总结


1、前言

说起垃圾回收(Garbage Collection)(本文简称GC)。相信同时对C++和Java有了解的小伙伴都知道,C++在new完对象后,是需要手动delete对象来释放内存的,而Java则不需要。虽然我们Java程序员不需要去手动的释放内存,但是了解JVM如何处理这一过程对我们来说也是很有必要的。

JVM对于垃圾回收这一篇幅其实是很长的,既然要对垃圾进行回收,那么不可避免的要思考三个问题:①哪些需要回收、②什么时候回收、③如何回收。

本文主要先讲解三个经典的垃圾回收算法,后面笔者会陆续更新其他的内容(比如什么是安全点,什么是安全区,经典垃圾回收器等)。

2、标记-清除算法

如上图所示,标记-清除算法就是每次进行垃圾回收时,标记出可以回收的对象,然后直接将这些对象回收(即释放对应区域的内存)即可。

标记-清除算法优点显而易见:那就是简单、高效(对于清除这一步骤来说)。因为我们只需要将标记出的对象直接清除便可,因此效率很高。

但是缺点相信学过操作系统的小伙伴肯定一眼就看出来了:久而久之会存在大量内存碎片,导致大对象无法分配到所需的内存空间。

3、标记-整理算法

如上图所示,标记-整理算法就是每次进行垃圾回收时,标记出可以回收的对象,然后将这些对象回收后,将存活的对象整理到连续的内存空间去。 

标记-整理算法实际上就是标记-清除算法的“改进版”,我们上述说到标记-清除算法的缺点就是会存在大量内存碎片,导致大对象无法分配到所需的内存空间。标记-整理算法在标记-清除算法的基础上,加了一个将存活对象移动到连续的内存空间这一步骤。

标记-整理算法的优点肯定大家也想到了——内存利用的更加充分,不会存在内存碎片,导致大对象分配不到所需的内存空间。

但是缺点想必大家也看出来了——回收时,每次都要将对象移动到一起,性能肯定会受到一定的影响。特别是当大部分对象都要回收时,只有少部分离散的对象存活,这个时候性能被影响的会更加明显。

4、标记-复制算法

如上图所示,标记-复制算法就是将内存区域分为两部分(这里我们称为回收区和保留区),垃圾回收时,我们每次标记出需要回收的对象,然后将不需要回收的对象复制到“保留区”后,将存活区的所有对象一起清除(因为我们在保留区保留了不需要回收的对象,所以回收区都可以回收了)。然后原回收区就空了,变成保留区,原保留区有对象,此时变成回收区。

标记-复制算法相对上述标记-整理算法来说,对于大部分对象都要回收时,只有少部分离散的对象存活这个场景来说,更加适用、高效,解决了这个场景下标记-整理算法的不足。

缺点也很明显,那就是我们每次都有一部分内存区域用不上(因为要拿一部分来当保留区)。

5、总结

本文只是比较快速的介绍了一下三个经典的垃圾回收算法,同时也说明了他们的优缺点。这里我们给大家一些总结:

  1. 对于追求垃圾回收延迟低(即垃圾回收这一过程快)的场景下,推荐使用“标记-清除算法”。
  2. 对于大部分对象都要回收时,只有少部分离散的对象存活这个场景下,我们推荐使用“标记-复制算法”。(在后面我们讲到分代思想时,新生代大部分都需要回收,因此是使用这个算法。)
  3. 对于少部分对象要回收,大部分对象都存活的场景下,我们推荐使用“标记-整理算法”(在后面我们讲到分代思想时,老年代大部分都不需要回收,因此是使用这个算法。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JVM篇】垃圾回收算法 的相关文章

随机推荐

  • es实战-rebalance功能及源码解析

    rebalance tasks在es集群里面的表现形式 通过调用 GET cat tasks v API 返回结果中 action 为 internal index shard recovery start recovery 不仅仅是reb
  • C#中Dispose、析构函数、close的区别

    C 中Dispose 析构函数 close的区别 一 Close与Dispose这两种方法的区别 调用完了对象的Close方法后 此对象有可能被重新进行使用 而Dispose方法来说 此对象所占有的资源需要被标记为无用了 也就是此对象要被销
  • c程序设计(第四版)、p102例4.6(查询成绩等级)

    谭浩强 c程序设计 第四版 p102例4 6 include
  • 抖音热门游戏Fill one-line puzzle game解法的Python代码实现

    抖音热门游戏Fill one line puzzle game解法的Python代码实现 导语 思路 代码 验证 谢谢小李同学的提醒 加上了无解的判断 不然如果无解就进入死循环了 版权声明 原创文章 转载请注明出处 导语 最近刷抖音的时候
  • c++综合练习题六

    1 t1 txt文件中保存某超市不同商品的销售情况 读取文件中的数据 要求使用容器存放 使用迭代器输出输出所有数据 对获取到的数据按照销售额进行降序排序并输出 对降序后的数据存入到新的文本t2 txt中 方法一 int main fstre
  • 无监督学习和自监督学习的区别

  • 解决windows系统wifi图标不见了的问题

    前言 最近大家在使用win11的时候是不是常常会遇到一个情况 那就是在某一次开机时wifi图标不见了 是不是很惊讶 没有动什么东西呀 难道wifi模块坏了 上次关机时挺正常的呀 是不是心里面很多疑问 哈哈 恰巧我最近也遇到了这个问题 刚开始
  • 检查IP或端口是否被封

    遇到IP连接超时 想要确认是否被封 可通过以下几个方式检验 IP可用性检测工具 Tools大全在线工具 Ping mtr dig and TCP port check from multiple locations 端口扫描 站长工具
  • Eclipse下,LogCat(deprecated),显示不了内容,或者全部都是Unknown

    这张图片中的下面的LogCat deprecated 显示不了内容 或者全部都是Unknown 我的解决方法是打开LogCat 没有 deprecated 标志的那个 deprecated 意思为弃用 废弃 不赞成 这样就能使用了 但是有些
  • 2023最新Python阅读书籍推荐

    a byte of python 中文 简明 Python 教程 入门的书很多 但能让新手轻松看懂的就少了 作者写的思路非常清晰 对每一个知识点讲解的很到位 不多不少 对初学者来说 力道刚刚好 这本书是Python入门最好的书 A byte
  • Eclipse IDE for C / C++ 安装教程 之 eclipse的安装及配置

    下载eclipse 前提 安装配置好JDK 官网下载eclipse installer eclipse下载器 或者官方下载对应版本zip 优点 方便省事 缺点 下载速度比较慢 安装器是64位的 对32位的机器不太友好 或者选择 清华大学开源
  • Vue Luckyexcel 将文件流转成file文件后使用Luckysheet回显数据 - 附完整示例

    Luckysheet 一款纯前端类似excel的在线表格 功能强大 配置简单 完全开源 官方文档 快速上手 Luckysheet文档快速上手 Luckysheet文档Luckysheet 一款纯前端类似excel的在线表格 功能强大 配置简
  • Basic Level 1075 链表元素分类 (25分)

    题目 给定一个单链表 请编写程序将链表元素进行分类排列 使得所有负值元素都排在非负值元素的前面 而 0 K 区间内的元素都排在大于 K 的元素前面 但每一类内部元素的顺序是不能改变的 例如 给定链表为 18 7 4 0 5 6 10 11
  • OpenCV常用方法总结

    图像导入 import cv2 as cv src cv imread lena jpg cv namedWindow input cv WINDOW AUTOSIZE cv imshow input src cv imwrite save
  • 大事件项目

    目录 1 0 资源地址 1 项目前期的准备工作 1 1 初始化项目结构 1 2 使用GitHub管理大事件的项目 1 3 安装VSCode的Live Server插件辅助开发 2 登录注册 2 1 绘制login页面的基本结构 2 2 实现
  • 【前端】使用ffmpeg+vue3实现简单的视频编辑器

    使用ffmpeg vue3实现简单的视频编辑器 主要依赖 ffmpeg ffmpeg vue 实现功能 视频转码 添加文字水印 添加图片水印 处理进度条和用时 文件编码信息 生成序列帧 界面效果 ffmpeg演示 渲染成品 fmpeg渲染成
  • linux命令之split

    splilt命令的目的是将文件按照一定的规则切分 实战 我现在有一份文件觉得太大 想要切分 split 1000000 a1 kongke company 1000000是按照每100w行去切分 a1 是后缀只有一个 文件名称默认就是xaa
  • MySQL的count(*) ,count(1),count(id)的区别

    数据库查询相信很多人都不陌生 所有经常有人调侃程序员就是CRUD专员 这所谓的CRUD指的就是数据库的增删改查 在数据库的增删改查操作中 使用最频繁的就是查询操作 而在所有查询操作中 统计数量操作更是经常被用到 关于数据库中行数统计 无论是
  • 【Spring】Spring事务

    Spring事务 文章目录 Spring事务 0 事物的概念 1 Spring事务的配置方式 1 1编程式事务管理 1 2声明式事务管理 2 Spring事务的传播机制 3 事物的隔离级别 4 只读 5 事务超时 6 回滚规则 7 Spri
  • 【JVM篇】垃圾回收算法

    目录 1 前言 2 标记 清除算法 3 标记 整理算法 4 标记 复制算法 5 总结 1 前言 说起垃圾回收 Garbage Collection 本文简称GC 相信同时对C 和Java有了解的小伙伴都知道 C 在new完对象后 是需要手动