这是我使用jvm的g1垃圾回收在GC时遇到的问题:
2400.241: [GC concurrent-root-region-scan-start]
2400.241: [Full GC (Metadata GC Threshold) 2400.252: [GC concurrent-root-region-scan-end, 0.0101404 secs]
2400.252: [GC concurrent-mark-start]
1151M->603M(4356M), 2.6980537 secs]
[Eden: 0.0B(2558.0M)->0.0B(2613.0M) Survivors: 55.0M->0.0B Heap: 1151.7M(4356.0M)->603.6M(4356.0M)], [Metaspace: 259187K->92248K(1034240K)]
[Times: user=3.92 sys=0.00, real=2.70 secs]
这需要很长时间,每20-30分钟,metaspace就会触发一次完整的gc。
我的jvm metaspce元空间大小配置参数如下:
"-XX:MaxMetaspaceSize=768M",
"-XX:MetaspaceSize=256M"
每次它达到256M时,就会触发一次完整的full gc。
当它到达这个第一个高水位线时,它是否应该在下次达到最大内存之前使它变大?另外,metaspace上的gc会触发old gen老年代上的完整gc吗?
这使得p99的响应时间比我预期的要高。
分析原因
我的理解是元空间本身并不是每次被垃圾收集的。相反