Java - Garbage Collection

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
Licensed under CC BY-NC-SA 4.0
Get Things Done
Built with Hugo
Theme Stack designed by Jimmy