每当应用程序使用G1收集算法时,GC时对大对象的分配可能会影响应用程序的性能(强调:大对象分配是指大于region大小的50%对象的分配)。
频繁地大对象分配会引发一下GC性能问题:
- 如果region当中包含大对象,剩余regiong空间将不再被使用,如果对象只是刚刚超过region的50%多一点,那么就会造成很大的空间浪费。
- 对于大对象的收集,G1并不像常规那样处理,JAVA1.8u40之前,大对象的回收只能在Full GC事件期间完成,Hotspot JVM 最新版本会在清除阶段标记周期结束时释放大区域,对于轿新的JVM来说,问题的影响已经显著下降。
要检查应用是否存在大对象空间需要制定JVM参数:
java -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintReferenceGC -XX:+UseG1GC -XX:+PrintAdaptiveSizePolicy -Xmx128m MyClass
G1出现大对象的日志:
0.106: [G1Ergonomics (Concurrent Cycles) request concurrent cycle initiation, reason: occupancy higher than threshold, occupancy: 60817408 bytes, allocation request: 1048592 bytes, threshold: 60397965 bytes (45.00 %), source: conc