我有一个基于spring-boot的微服务。它是高吞吐量的读取服务。我注意到,如果我让服务器运行更长的时间(几个小时或一天)而没有施加任何负载,则G1 Eden空间会不断增长,在此期间不会发生任何GC。结果,一旦我开始向服务器发送流量,GC就会启动,GC时间将比一般的更长(从240毫秒到480毫秒几乎翻了一番)。这样会使线程在短时间内处于繁忙状态,并导致客户端请求超时。
Java version: 1.8.0_131
Current load: 450 TPS
GC: G1GC
Heap Parameter used:
-Xms4g
-Xmx4g
-XX:NewRatio=2
-XX:SurvivorRatio=8
-XX:TargetSurvivorRatio=90
-XX:+UseCompressedClassPointers
-XX:+UseCompressedOops
-XX:MetaspaceSize=640m
-XX:MaxMetaspaceSize=640m
-Xss512k
-XX:+UseG1GC
问题:
1)为什么服务器处于空闲状态时没有GC活动?
2)为什么我们在GC的初始阶段增加了GC时间,从而使所有线程暂停了更长的时间?
3)为什么我们看到G1幸存者空间激增?