jvm主要的gc算法有:标记-清除(Mark-Sweep)、复制(Copying)、标记-整理(Mark-Compact)和分代收集(Generational Collection)
1. 标记-清除(Mark-Sweep)
算法原理介绍:首先标记处所有需要回收的对象,等待标记完成之后一次性将全部标记对象回收
示意图:
缺点:效率不高、空间问题(这个算法会产生很多不连续的内存碎片)
2. 复制(Copying)
算法原理介绍:将内存分为大小相等的两块,每次只使用其中的一块。当这一块内存用完时,将还存活的对象复制到另外一块内存中,再一次性将原本的这块内存处理掉。
示意图:
缺点:内存利用率不高
3. 标记-整理(Mark-Compact)
算法原理介绍:首先将所有需要清除的对象标记出来,然后让所有存活的对象都向内存的一端移动,保证内存的连续性,最后将边界以外的内存全部清理掉。
示意图:
4. 分代收集(Generational Collection)
这个算法并不是一种新的算法,而是将内存根据对象存活周期分为几块(一般分为新生代和老年代),再根据不同的区域采用以上收集算法。
在新生代中,每次都会有大量的对象死去,只有少量的对象存活,对象复制的成本较低,就采用复制算法。
在老年代中,对象普遍存活率高,使用标记-清除或者标记-整理算法。
just keep real!