Modernized GC in java requires more CPU resources to perform GC tasks, to avoid latency.
Serial is still prevail in Docker-based tiny applications, while there maybe only one CPU to use.
Algorithm
Copy
- high throughput
- very fast allocation
- no fragments
- cacheline friendly
Collector
G1
Region
CMS - Concurrent Mark Sweep
a
Tips
- GC 算法一般将堆分代处理, 以增加 GC 线程处理的并发度
- 尽量降低在老年代中执行 GC 的影响, 需要在停顿时间和 CPU 使用率之间作出权衡.
如何选择 GC
- 单个请求会受到停顿时间的影响. 如果目标是尽量减少停顿对响应时间的影响, 并发回收器更加合适.
- 若平均响应时间比异常值更重要, 非并发回收器更合适
- 并发回收器避免长时间停顿是以消耗额外 CPU 周期为代价的.
防止 G1 FGC
- 增加老年代的大小, 增加堆空间的总大小, 调整分代比例
- 增加后台线程的数量
- 更频繁地执行 G1 GC 后台活动
InitiatingHeapOccupancyPercent
- 增加 MixedGC 周期的工作量
- 避免晋升失败, 可以减少 G1
MixedGCCountTarget