垃圾回收


jvm的垃圾回收机制

由于jvm将所有对象都保存在内存中,因此及时腾出堆内存中无用的空间就至关重要了,jvm通过内存回收的方式对堆内存进行回收整理
回想咱们打扫家务的步骤是不是第一步要将脏东西找出来丢掉,第二步将剩余有用的东西整理码放好。jvm中进行内存回收的步骤也差不多分为标记清除整理。根据不同的特点设计出不同的回收算法。

GC回收算法

  • 复制算法

通过复制一个镜像内存空间,每次进行回收时就将有用的对象复制到镜像内存空间中。

  • 标记-清除

将垃圾对象直接镜像删除

  • 标记-整理

在标记-清除后增加一个步骤整理

分代机制

由于堆中的对象大部分是朝生夕灭的,因此将堆内存从逻辑上划分为不同的区域。在根据不同的区域用不同的GC算法。

  • 年轻代

年轻代的特点是存储的对象大部分都是朝生夕灭,因此将年轻代中的数据按照1:1:8 = survivor:survivor:Eden的比例进行划分

  • 老年代

GC回收器

年轻代的回收器

  1. Serial垃圾回收器

单线程的GC回收器

  1. PerNew垃圾回收器

多线程的GC回收器,注重于减少停顿时间

  1. Parallel Scavenge垃圾回收器

多线程版本的垃圾回收器,注重于CPU的吞吐量

老年代垃圾回收器

  1. Serial Old垃圾回收器

  2. Parallel Old

  3. CMS

CMS垃圾回收器

CMS垃圾回收器比其他垃圾回收器优化的地方在于并发,可以并发的和应用程序的线程同时进行。

执行步骤

  • 初始阶段(STW)
  • 并发标记(并发)
  • 重新标记(STW)
  • 并发清理(并发)

由于CMS垃圾回收方式没有内存整理这一步骤,因此在老年代到达阀值的时候会进行full GC,此时会重新整理内存

G1垃圾回收器

G1垃圾回收器是指定最小停顿时间,通过尽可能的到达停顿时间来完成GC的一种垃圾回收算法。


  TOC