美文网首页
Java 虚拟机 垃圾回收算法 小记

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

作者: 大川的川 | 来源:发表于2020-02-05 16:38 被阅读0次
你瞅啥?

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

算法1、标记-清除算法

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

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

标记-清除

算法2、复制算法

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

算法3、标记整理算法

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

算法4、分代收集算法

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

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

相关文章

网友评论

      本文标题:Java 虚拟机 垃圾回收算法 小记

      本文链接:https://www.haomeiwen.com/subject/ltmsxhtx.html