Poison

Ergonomics

业务方反馈某组应用偶现超时,超时时间为 2s, 大概一两天出现一次,经过排查,超时出现的时刻应用正在进行 FullGC, 触发原因为 Ergonomics, 该组应用未显式设置过 GC 收集器,Java 8 默认为 Parallel GC, 该收集器以吞吐量为目标,并不注重最大暂停时间,且根据之前的测试,在使用该收集器时即使设置了 -XX:MaxGCPauseMillis=,也只能提示收集器尽量实现该目标,并不能保证一定能将最大暂停时间控制在设置的最大值,根据 Oracle 的文档,笔者将该组应用的 GC 收集器更换为 G1 后解决了该超时问题。

其实在 Oracle 官方文档 Available Collectors 对如何选择收集器已经有了明确的说明,如果响应时间比总体吞吐量更重要,并且垃圾收集暂停时间必须保持小于 1 秒,那么请使用 -XX:+UseConcMarkSweepGC 或者 -XX:+UseG1GC.

If response time is more important than overall throughput and garbage collection pauses must be kept shorter than approximately 1 second, then select the concurrent collector with -XX:+UseConcMarkSweepGC or -XX:+UseG1GC.

附一个查看当前 JVM 进程 JVM 参数的命令:

1
jps -lvm

相关文档参考:
Ergonomics
Available Collectors
Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide
jps - Java Virtual Machine Process Status Tool
GCeasy