JVM 垃圾回收算法
垃圾回收算法主要有标记复制算法、标记清理算法、标记整理算法和分代理论。
分代理论
分代理论,是当前大多垃圾收集器使用的理论算法。它主要是解决对象生命周期不同设置的一种思想。
分代理论在不同垃圾回收器中是不一样的,在G1中分代理论虽说被继续沿用,但是,G1垃圾收集器使用的堆内存不在物理上进行隔离。即年轻代和老年代不存在物理上的隔离。但是CMS等其他收集器上,年轻代和老年代是独立的。
标记复制算法
标记复制算法主要适用于年轻代的一种算法思想。这个算法的思想是将内存区域划分为两个部分,当回收垃圾时,将不需要回收的对象移入另一块内存之中,将所有不需要回收的对象放到另一块区域之后,将需要回收的所有对象清楚。
这种算法效率比较慢,因为它涉及到对象的移动,并且需要额外的内存,造成内存有一部分未完全适用。
如下图所示,标记复制算法的整体流示意图
标记清理算法
标记清理算法和标记复制算法不同,它没有对堆内存进行预留空间。当JVM标记到对象是可回收对象之后,会对堆空间进行释放。它主要包括两个环节。
- 标记:对堆中的对象进行扫描,标记出可回收对象和不可回收对象
- 清理:清理所有可以回收的对象。
这种算法比较简单,是最基础的一种算法思想,但是它具有一定的弊端:
1. 内存碎片比较多,因为内存清理之后未对内存区域进行整理,长时间运行之后会造成堆内存中产生非常多的不连续内存
2. 效率问题,如果标记的内存过多,会造成运行效率不高
如下图所示,标记清理算法的整体流示意图
标记整理算法
标记整理算法,将堆中的对象进行整理标记,标记过程跟标记清理算法保持一致,将回收对象内存区域空间回收之后,会对堆内存空间进行整理,是内存占用空间在物理上是连续的。
标记整理算法流程如下: