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

07-垃圾收集算法详解

上一篇:06-JVM对象内存回收机制深度剖析

1.分代收集理论

当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。注意,“标记-清除”或“标记-整理”算法会比复制算法慢10倍以上。

2.标记-复制算法

为了解决效率问题,“复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。
在这里插入图片描述

3.标记-清除算法

算法分为“标记”和“清除”阶段:标记存活的对象, 统一回收所有未被标记的对象(一般选择这种);也可以反过来,标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象 。它是最基础的收集算法,比较简单,但是会带来两个明显的问题:

  1. 效率问题 (如果需要标记的对象太多,效率不高)
  2. 空间问题(标记清除后会产生大量不连续的碎片)

在这里插入图片描述

4.标记-整理算法

根据老年代的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
在这里插入图片描述
下一篇:08-JVM垃圾收集器详解

http://www.lryc.cn/news/161181.html

相关文章:

  • Redis高并发分布式锁实战
  • MybatisPlus分页插件使用
  • Linux指令二【进程,权限,文件】
  • uni-app运行到微信开发者工具-没有打印的情况
  • 由前端接口入门学习后端的controller层
  • HJ71 字符串通配符
  • ffmpeg 开发笔记
  • 一种基于注意机制的快速、鲁棒的混合气体识别和浓度检测算法,配备了具有双损失函数的递归神经网络
  • [运维|系统] go程序设置开机启动踩坑笔记
  • CRC原理介绍及STM32 CRC外设的使用
  • Python 操作 Word
  • Linux--进程创建(fork)-退出--孤儿进程
  • LeetCode 热题 HOT 100:链表专题
  • Redis发布订阅
  • 在Windows操作系统上安装PostgreSQL数据库
  • 【云原生】Kubeadmin部署Kubernetes集群
  • Java中wait和notify详解
  • 算法竞赛个人注意事项
  • ClickHouse和Doris超大数据集存储
  • 02-Flask-对象初始化参数
  • 第5篇 vue的通信框架axios和ui框架-element-ui以及node.js
  • RabbitMQ 知识点解读
  • SimVODIS++: Neural Semantic Visual Odometry in Dynamic Environments 论文阅读
  • 7.Xaml Image控件
  • Solidity 小白教程:11. 构造函数和修饰器
  • 静态工厂模式,抽象工厂模式,建造者模式
  • 【动手学深度学习笔记】--门控循环单元GRU
  • 浅析linux异步io框架 io_uring
  • 访问者模式的一个使用案例——文档格式转换
  • 【MySql】数据库的聚合查询