Java 虚拟机 垃圾回收算法 小记

你瞅啥?

由于垃圾回收算法的实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,因此不进行过多讨论算法的实现了,只记录和学习!

算法1、标记-清除算法

最基础的收集算法是“标记-清除”算法,此算法分为“标记”和“清除”两个阶段。

它的主要不足有两点:
不足一:效率问题,标记和清除两个过程的效率都不高。
不足二:空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致以后程序运行过程中需要分配较大对象时,无法找到足够且连续内存,从而不得不触发一次垃圾回收的动作。

标记-清除

算法2、复制算法

将可用内存分成大小相同的两块,每次只用其中一块。当一块内存用完,就将还存活的对象复制到另外一块上,然后再把已经使用过的内存空间一次清理掉。
  • 优点:
    这样每次只针对整个半区进行内存回收,内存分配时也无需考量内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。
  • 缺点:
    这种算法的代价是将内存缩小了一半,代价略高。如果程序对象存活率较高,就会进行较多的复制操作,效率会降低
    复制算法

算法3、标记整理算法

让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
  • 优点:
    适用于老年代的算法,不会产生大量不连续的内存碎片,且用于完整的内存块
  • 缺点:
    不适用于新生代,新生代对象存活率太低,此法会增加效率计算负担
    标记整理算法

算法4、分代收集算法

当前商业虚拟机的垃圾收集都采用“分代收集”算法,这种算法并没有什么新的思想,只是根据对象存活周期的不同将内存划分为几块。一般情况是把Java堆分为“新生代”和“老年代”,这样可以根据年代特点采用最实用的算法。
  • 1、在新生代中,每次垃圾回收都会有大批对象死去,只有少量存活,就选用“复制算法”,只需要复制少量存活对象的成本就可以完成回收。
  • 2、在老年代中,对象的存活率较高,没有额外空间对它进行分配担保,就必须使用“标记-清除”或“标记-整理”算法进行回收。

以上是个人的记录,仅供参考学习,不作为技术点和科研依据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容