Loading

JVM垃圾回收笔记

垃圾回收算法解析

标记-清除算法

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

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

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

问题

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

image-20230723105058894

复制算法

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

问题:

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

image-20230723105452874

标记-整理算法

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

image-20230723105852218

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

分代收集算法

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

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

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

posted @ 2023-09-27 09:44  墨鱼yyyl  阅读(7)  评论(0)    收藏  举报  来源