JVM垃圾回收笔记
垃圾回收算法解析#
标记-清除算法#
分为标记和清楚两个阶段:
- 标记:将所有不需要回收的对象进行标记
- 清楚:将所有没有被标记的对象进行清楚
猜测:为什么是对不回收的对象标记?是因为一次垃圾回收中,很多对象都是会被清除,留下的较少,因此标记它所进行修改的语句执行的会少一些。
问题:
- 效率:标记和清楚两个过程效率都不高
- 空间:标记清楚后会产生大量不连续的内存碎片,后续运行中不好利用
复制算法#
用于解决内存碎片问题。将内存分为大小相等的两块,每次只使用其中一块,当其中一块快使用完时就将还存活的对象复制到另一块,然后再把使用的空间进行清理。
问题:
- 可用内存变小:可以使用的内存变为了原本的一半。
- 不适合老年代: 如果存活对象数量比较大那么复制的性能会很差。
标记-整理算法#
标记过程与标记-清理算法一样,但后续不是直接回收对象,而是让所有存活对象向一端移动,然后直接清理掉端边界以外的内存。
由于整理这一步,因此效率也不高,适合老年代这种垃圾回收频率不是很高的场景。
分代收集算法#
根据对象的存活周期的不同将内存分为几块,一般将Java堆分为老年代和新生代。
在新生代中,每次收集都会有大量对象死去,所以可以用标记-复制算法。这样只需要付出少量复制成本就能完成收集。
在老年代中,由于对象存活的几率比较高,而且很多对象可能是大对象,而且没有额外的空间对它进行分配担保,所以会用标记-清楚或标记-整理算法进行收集。
作者:墨鱼-yyyl
出处:https://www.cnblogs.com/moyu-yyyl/p/18009686
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?