JVM
0

垃圾收集算法

2024.10.11 | cuithink | 24次围观


已经能够确定一个对象为垃圾之后,接下来要考虑的就是回收,怎么回收呢?得要有对应的算法,下面介绍常见的垃圾回收算法。高效   健壮


标记-清除(Mark-Sweep)


  • 标记


找出内存中所有的存活对象,并且把它们标记出来



  • 清除


清除掉被标记需要回收的对象,释放出对应的内存空间



缺点


标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程
序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
(1)标记和清除两个过程都比较耗时,效率不高
(2)会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。


标记清除算法的衍生规则之分配(动态分区分配策略)


首次适应算法(Fisrt-fit)


首次适应算法(Fisrt-fit)就是在遍历空闲链表的时候,一旦发现有大小大于等于需要的大小之后,就立即把该块分配给对象,并立即返回。


最佳适应算法(Best-fit)


最佳适应算法(Best-fit)就是在遍历空闲链表的时候,返回刚好等于需要大小的块。


最差适应算法(Worst-fit)


最差适应算法(Worst-fit)就是在遍历空闲链表的时候,找出空闲链表中最大的分块,将其分割给申请的对象,其目的就是使得分割后分块的最大化,以便下次好分配,不过这种分配算法很容易产生很多很小的分块,这些分块也不能被使用


标记-复制(Mark-Copying)


将内存划分为两块相等的区域,每次只使用其中一块,如下图所示:


![](file://E:\桌面\yzt\笔记课件\JVM\3天JVM训练营\资料+笔记\images\27.png?lastModify=1646720640)


当其中一块内存使用完了,就将还存活的对象复制到另外一块上面,然后把已经使用过的内存空间一次清除掉。



缺点:空间利用率降低。


标记-整理(Mark-Compact)


复制收集算法在对象存活率较高时就要进行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都有100%存活的极端情况,所以老年代一般不能直接选用这种算法。


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


其实上述过程相对"复制算法"来讲,少了一个"保留区"



让所有存活的对象都向一端移动,清理掉边界意外的内存。




粤ICP备16076548号
发表评论