系列文章规划:
- JVM原理及调优(1)——内存模型
- JVM原理及调优(2)——内存管理
- JVM原理及调优(3)——编译机制
- JVM原理及调优(4)——类加载机制
- JVM原理及调优(5)——垃圾回收和调优
- JVM原理及调优(6)——G1收集器及G1日志分析
- JVM原理及调优(7)——JDK常用内置工具
1 G1简介
1.1 概述
G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多核处理器及大容量内存的机器。
在极大概率满足GC停顿时间要求的同时,还具备高吞吐量的特性.。Oracle JDK 7 update 4 及以上版本已完全支持。其设计目标如下:
- 可以像CMS收集器一样,GC操作与应用的线程一起并发执行;
- 紧凑的空闲内存区间且没有很长的GC停顿时间;
- 需要更多可预测的GC停顿时间;
- 不想牺牲太多吞吐量性能;
- 启动后不需要请求更大的Java堆。
G1的长期目标是取代CMS(Concurrent Mark-Sweep Collector, 并发标记-清除)。因为特性的不同,G1成为比CMS更好的解决方案。其中一个区别是,G1是一款压缩型的收集器。G1通过有效的压缩完全避免了对细微空闲内存空间的分配,不用依赖于regions,这不仅大大简化了收集器,而且还消除了潜在的内存碎片问题。除压缩以外,G1的垃圾收集停顿也比CMS容易估计,也允许用户自定义所希望的停顿参数(pause targets)。
内存占用
如果从 ParallelOldGC 或者 CMS收集器迁移到 G1,可能会看到JVM进程占用更多的内存(a larger JVM process size)。 这在很大程度上与 “accounting” 数据结构有关,如 Remembered Sets 和 Collection Sets。
Remembered Sets 简称 RSets。跟踪指向某个heap区内的对象引用。 堆内存中的每个区都有一个 RSet。 RSet 使heap区能并行独立地进行垃圾集合。 RSets的总体影响小于5%。
Collection Sets 简称 CSets。收集集合, 在一次GC中将执行垃圾回收的heap区。GC时在CSet中的所有存活数据(live data)都会被转移(复制/移动)。集合中的heap区可以是 Eden, survivor, 和/或 old generation。CSets所占用的JVM内存小于1%。
推荐使用G1的场景
G1的首要目标是为需要大量内存的系统提供一个保证GC低延迟的解决方案。 也就是说堆内存在6GB及以上,稳定和可预测的暂停时间小于0.5秒。
如果应用程序具有如下的一个或多个特征,那么将垃圾收集器从CMS或ParallelOldGC切换到G1将会大大提升性能。
- Full GC 次数太频繁或者消耗时间太长.
- 对象分配的频率或代数提升(promotion)显著变化.
- 受够了太长的垃圾回收或内存整理时间(超过0.5~1秒)
注意: 如果正在使用CMS或ParallelOldGC,而应用程序的垃圾收集停顿时间并不长,那么建议继续使用现在的垃圾收集器。使用最新的JDK时,并不要求切换到G1收集器。