-
第一步:开启 G1 垃圾收集器
-
第二步:设置堆的最大内存
-
第三步:设置最大的停顿时间
G1 中提供了三种模式垃圾回收模式,Young GC、Mixed GC 和 Full GC ,在不同的条件下被触发。
二、原理
G1 垃圾收集器相比于其他收集器而言,最大的区别在于它取消了年轻代、老年代的物理划分,取而代之的是将堆划分为若干个区域(Region),这些区域中包含了有逻辑上的年轻代、老年代区域
这样做的好处就是,我们再也不用单独的空间对每个代进行设置了,不用担心每个代内存是否足够。
在 G1 划分区域中,年轻代垃圾收集器依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者 Survivor 空间,G1 收集器通过将对象从一个区域复制到另一个区域,完成了清理工作。
这就意味着,在正常的处理过程中,G1 完成了堆的压缩(至少是部分堆的压缩),这样也就不会有 CMS 内存碎片问题的存在了,
在 G1 中,有一种特殊的区域,叫 Humongous 区域。
-
如果一个对象占用的空间超过了分区容量 50%以上,G1 收集器就认为这是一个巨型对象
-
这些巨型对象,默认直接会被分配在老年代,但是如果它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。
-
为了解决这个问题,G1 划分了一个 Humongous 区,它用来专门存放巨型对象,如果一个 H 区装不下一个巨型对象,那么 G1 会寻找连续的 H 分区存储,为了能找到连续的 H 区,有时候不得不启动 Full GC
三、Young GC
Young GC 主要是对 Eden 区进行 GC,它在 Eden 空间耗尽时会被触发。
-
Eden 空间的数据移动到 Survivor 空间中,如果 Survivor 空间不够,Eden 空间的部分数据会直接晋升到年老代空间
-
Survivor 区的数据移动到新的 Survivor 区中,也有部分数据晋升到老年代空间中
-
最终 Eden 空间的数据为空,GC 停止工作,应用线程继续执行