文章目录
- 前言
- 标记清除(Mark-Sweep)
- 介绍
- 优缺点
- 复制(拷贝 Copying)
- 介绍
- 优缺点
- 标记整理(Mark-Compact)
- 介绍
- 优缺点
前言
目前JVM中有三种常见的垃圾回收算法,分别是:标记清除、标记整理和复制,这三种垃圾回收算法各有优缺点,下面逐一介绍。
在读本篇文章中,如果对JVM中哪个是垃圾,哪个不是垃圾,JVM到底是怎么知道的,请先读下面这篇文章
【JVM】JVM 判断对象存活算法(引用计数算法与根可达性分析算法)
标记清除(Mark-Sweep)
介绍
标记清除算法主要分成两个阶段,就跟算法的名字一样,标记和清除,标记阶段是发现哪些对象是个垃圾后,打上标记,等到都标记完成后,就是清除阶段,清除阶段就是把该对象清掉。
下面是一个示例图,上面的图代表清理前的时候,内存中的对象分布情况,下面的图代表经过标记清除算法后,内存中的对象分布情况:
优缺点
优点:效率高。
缺点:可用内存太分散,称之为内存碎片化,如果这时候来一个大的对象,需要占到连续的内存区域,就会出现找不到可用的连续内存区域的情况。
复制(拷贝 Copying)
介绍
复制算法的思路是将内存区域一分为二,分别为A区域和B区域(注:这里的A区域和B区域只是方便理解
),新产生的对象会丢在A区域内,当A区域满了以后,就会把A区域内的存活对象都移到B区域内,并在B区域内把存活对象排列好,然后A区域整体清理回收;那么如果B区域满了以后呢,就会把B区域内的存活对象移到A区域内,在A区域内把存活对象排列好,然后把B区域整体清理回收,循环往复,下面是示例图:
优缺点
优点:效率高,并且把内存空间整理了。
缺点:浪费内存,只能用内存的一半。
标记整理(Mark-Compact)
介绍
标记整理算法与标记清除算法很像,标记整理算法可分为三个阶段,前面两个阶段与标记清除算法本身一样,标记阶段是发现哪些对象是个垃圾后,打上标记,等到都标记完成后,就是清除阶段,清除阶段就是把该对象清掉,剩下就到了整理阶段,整理阶段是将剩余的存活对象重新在内存区域内排列,这样做就会避免内存碎片化,下面是示例图。
优缺点
优点:清除垃圾对象后把内存排列好了。
缺点:效率低,是这三种算法中效率最低的,。