jvm的垃圾回收机制
由于jvm将所有对象都保存在堆内存中,因此及时腾出堆内存中无用的空间就至关重要了,jvm通过内存回收的方式对堆内存进行回收和整理
回想咱们打扫家务的步骤是不是第一步要将脏东西找出来丢掉,第二步将剩余有用的东西整理码放好。jvm中进行内存回收的步骤也差不多分为标记、清除、整理。根据不同的特点设计出不同的回收算法。
GC回收算法
- 复制算法
通过复制一个镜像内存空间,每次进行回收时就将有用的对象复制到镜像内存空间中。
- 标记-清除
将垃圾对象直接镜像删除
- 标记-整理
在标记-清除后增加一个步骤整理
分代机制
由于堆中的对象大部分是朝生夕灭的,因此将堆内存从逻辑上划分为不同的区域。在根据不同的区域用不同的GC算法。
- 年轻代
年轻代的特点是存储的对象大部分都是朝生夕灭,因此将年轻代中的数据按照1:1:8 = survivor:survivor:Eden的比例进行划分
- 老年代
GC回收器
年轻代的回收器
- Serial垃圾回收器
单线程的GC回收器
- PerNew垃圾回收器
多线程的GC回收器,注重于减少停顿时间
- Parallel Scavenge垃圾回收器
多线程版本的垃圾回收器,注重于CPU的吞吐量
老年代垃圾回收器
-
Serial Old垃圾回收器
-
Parallel Old
-
CMS
CMS垃圾回收器
CMS垃圾回收器比其他垃圾回收器优化的地方在于并发,可以并发的和应用程序的线程同时进行。
执行步骤
- 初始阶段(STW)
- 并发标记(并发)
- 重新标记(STW)
- 并发清理(并发)
由于CMS垃圾回收方式没有内存整理这一步骤,因此在老年代到达阀值的时候会进行full GC,此时会重新整理内存
G1垃圾回收器
G1垃圾回收器是指定最小停顿时间,通过尽可能的到达停顿时间来完成GC的一种垃圾回收算法。