JVM垃圾回收笔记

垃圾回收算法解析#

标记-清除算法#

分为标记和清楚两个阶段:

  • 标记:将所有不需要回收的对象进行标记
  • 清楚:将所有没有被标记的对象进行清楚

猜测:为什么是对不回收的对象标记?是因为一次垃圾回收中,很多对象都是会被清除,留下的较少,因此标记它所进行修改的语句执行的会少一些。

问题

  • 效率:标记和清楚两个过程效率都不高
  • 空间:标记清楚后会产生大量不连续的内存碎片,后续运行中不好利用

image-20230723105058894

复制算法#

用于解决内存碎片问题。将内存分为大小相等的两块,每次只使用其中一块,当其中一块快使用完时就将还存活的对象复制到另一块,然后再把使用的空间进行清理。

问题:

  • 可用内存变小:可以使用的内存变为了原本的一半。
  • 不适合老年代: 如果存活对象数量比较大那么复制的性能会很差。

image-20230723105452874

标记-整理算法#

标记过程与标记-清理算法一样,但后续不是直接回收对象,而是让所有存活对象向一端移动,然后直接清理掉端边界以外的内存。

image-20230723105852218

由于整理这一步,因此效率也不高,适合老年代这种垃圾回收频率不是很高的场景。

分代收集算法#

根据对象的存活周期的不同将内存分为几块,一般将Java堆分为老年代和新生代。

在新生代中,每次收集都会有大量对象死去,所以可以用标记-复制算法。这样只需要付出少量复制成本就能完成收集。

在老年代中,由于对象存活的几率比较高,而且很多对象可能是大对象,而且没有额外的空间对它进行分配担保,所以会用标记-清楚或标记-整理算法进行收集。

作者:墨鱼-yyyl

出处:https://www.cnblogs.com/moyu-yyyl/p/18009686

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   墨鱼yyyl  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示