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

简介: 垃圾回收算法 简述

垃圾回收算法

标记清除算法

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

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

内存碎片

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

标记-复制算法

半区复制

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

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空间不足以容纳上一次新生代收集下来的存活对象时,这些对象就会通过分配担保机制直接进入到老年代,这对虚拟机来说是安全的

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
24天前
|
算法 Java
JVM垃圾回收机制
JVM垃圾回收机制
15 0
|
1月前
|
Java 程序员
探讨JVM垃圾回收机制与内存泄漏
探讨JVM垃圾回收机制与内存泄漏
|
3天前
|
监控 Docker 容器
Docker从入门到精通:Docker log 命令学习
了解 Docker 日志管理对容器监控至关重要。`docker logs` 命令用于查看和管理容器日志,例如,`docker logs <container_name>` 显示容器日志,`-f` 或 `--follow` 实时跟踪日志,`--tail` 显示指定行数,`--timestamps` 添加时间戳,`--since` 按日期筛选。Docker 支持多种日志驱动,如 `syslog`,可通过 `--log-driver` 配置。有效管理日志能提升应用程序的稳定性和可维护性。
6 0
|
9天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。
|
10天前
|
机器学习/深度学习 算法 Python
使用Python实现集成学习算法:Bagging与Boosting
使用Python实现集成学习算法:Bagging与Boosting
19 0
|
14天前
|
存储 前端开发 安全
JVM内部世界(内存划分,类加载,垃圾回收)(上)
JVM内部世界(内存划分,类加载,垃圾回收)
48 0
|
17天前
|
算法
【算法学习--字符串】(不含KMP算法)
【算法学习--字符串】(不含KMP算法)
|
19天前
|
存储 缓存 算法
深度解析JVM世界:垃圾判断和垃圾回收算法
深度解析JVM世界:垃圾判断和垃圾回收算法
|
1月前
|
Java Serverless 对象存储
Serverless 应用引擎常见问题之jvm在进行垃圾回收的时候会导致重启如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
22 0
|
1月前
|
Rust Dart 算法
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!
55.3k star!开源算法教程,附带动画图解,学习算法不再苦恼!