JVM学习日志(十) 垃圾回收算法

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 垃圾回收算法 简述

垃圾回收算法

标记清除算法

就是根据之前的可达性分析算法+四种引用类型对象判断,来标记那些是可以被回收的对象(垃圾对象),哪些是存活的对象,然后对垃圾对象进行清理回收

如果我们仅仅是采用标记-清除算法,标记哪些对象是可以回收的,那些对象是不可以回收的,然后针对可回收的内容进行回收,就会导致一个不好的后果,产生大量的内存碎片

内存碎片

内存碎片一般是由于空闲的连续空间比要申请的空间小,导致这些小内存快不能被利用

标记-复制算法

半区复制

简单来说,将新生代的内存分为大小相等的两块,每次只是用其中的一块,当这块空间用完的时候,就将还存活的对象复制一份到另一块上面去,然后再把已经使用的内存空间一次性清理掉

image-20230424152652736.png

因此JVm也采用了复制算法,当真正发生垃圾回收的时候,JVM会将第一块空间中的那些对象是可以回收的,不能回收的进行标记[标记清除算法],然后将不可回收的对象统统复制到下面那块内存区域中,并且复制的时候可以紧凑的排列一起,最大化利用内存空间

image-20230424152720447.png

复制算法的缺点

复制算法确实可以解决内存碎片的问题,也使得我们的回收工作更效率,但是缺点很明显,就是将原来可以使用的内存空间减少为原来的一半,空间浪费有点太多了

IBM公司曾有一项目专门研究对新生代"朝生夕死"的特点做了更量化的诠释--新生代中的对象98%都熬不过第一轮收集,因此并不需要按照1:1的比例来进行划分新生代的内存空间

半区复制分代策略

现在称为appel式回收,HotSpot虚拟机的Serial,ParNew等新生代收集器均采用了这种策略来设计新生代的内存布局

Appel式回收的具体做法是把新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只是用Eden和其中一块Survivor.发生垃圾收集时,将Eden和Survivor中仍然存活的对象一次性赋值到另一块Survivor空间上,然后直接清理掉Eden和Survivor空间

HotSpot虚拟机默认Eden和Survivor的大小比例是8:1,也就是说每次新生代中可用内存空间为整个新生代容量的90%,只有一个Survivor空间是会被“浪费”的

image-20230424153925486.png

当然98%的对象可被回收仅仅是"普通场景"下测的的数据,任何人都没有办法百分百保证每次回收都只有不多于10%的对象存活,因此Appel式回收还有一个充当罕见情况的"逃生门"的安全设计,当Survivor空间不足以容纳一次Minor GC之后存活的对象时,就需要依赖其他内存区域(实际上大多就是老年代)进行分配担保(Handle Promotion)

分配担保

简单来说,当剩下的Survivor空间不足以容纳上一次新生代收集下来的存活对象时,这些对象就会通过分配担保机制直接进入到老年代,这对虚拟机来说是安全的

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
2月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
99 2
|
4月前
|
机器学习/深度学习 算法 数据挖掘
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
156 0
|
3月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
221 1
|
2月前
|
存储 运维 监控
局域网网络监控软件的设备连接日志哈希表 C++ 语言算法
针对局域网监控软件日志查询效率低的问题,采用哈希表优化设备连接日志管理。通过IP哈希映射实现O(1)级增删查操作,结合链地址法解决冲突,显著提升500+设备环境下的实时处理性能,内存占用低且易于扩展,有效支撑高并发日志操作。
153 0
|
9月前
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
9月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
240 3
|
11月前
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
2317 11
架构学习:7种负载均衡算法策略
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
228 0
|
2月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
173 2