Java 元空间 Full GC
Java Metaspace Full GC
我在使用 G1GC 时遇到一些问题。
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 分钟就会触发一次完整的 gc。
我是这样配置的:
"-XX:MaxMetaspaceSize=768M",
"-XX:MetaspaceSize=256M"
但是每次达到256M~就会触发full gc。当它达到第一个高水位线时,它不应该在下一次让它变大直到达到最大尺寸吗?
另外,元空间上的完整 gc 会触发旧代上的完整 gc?我在某个地方读过它,但我不确定。
这使 p99 响应时间比我预期的要长。
根据 Triggering of gc on Metaspace memory in java 8,为了减少 metaspace 的使用,需要完整的 GC。
我的理解是 metaspace 本身 不是垃圾收集器。相反,您在普通堆中有 objects,其中包含对 metaspace objects 的特殊引用。当 objects 被 GC 回收时,对应的 metaspace objects 被释放。 (从概念上讲,它就像终结器 free
-ing 元 space objects。)
When it reach this first high-water-mark should not it make it bigger next time until the max size?
显然不是。 HotSpot采集器的正常策略是这样的:
- 分配 objects 直到达到当前堆限制
- 运行收藏家
- 查看回收了多少 space,如果有必要,增加(或减少)堆大小。
这里好像也是用的一样的策略。完整的 GC 导致足够的 metaspace 被回收,它决定不需要扩展 metaspace.
A band-aid 将尝试将 -XX:MetaspaceSize
和 -XX:MaxMetaspaceSize
设置为相同的值,但这只会降低完整 GC 的频率。
一个真正的解决方案是弄清楚是什么在消耗元数据space,然后修复它。
我在使用 G1GC 时遇到一些问题。
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 分钟就会触发一次完整的 gc。 我是这样配置的:
"-XX:MaxMetaspaceSize=768M",
"-XX:MetaspaceSize=256M"
但是每次达到256M~就会触发full gc。当它达到第一个高水位线时,它不应该在下一次让它变大直到达到最大尺寸吗? 另外,元空间上的完整 gc 会触发旧代上的完整 gc?我在某个地方读过它,但我不确定。 这使 p99 响应时间比我预期的要长。
根据 Triggering of gc on Metaspace memory in java 8,为了减少 metaspace 的使用,需要完整的 GC。
我的理解是 metaspace 本身 不是垃圾收集器。相反,您在普通堆中有 objects,其中包含对 metaspace objects 的特殊引用。当 objects 被 GC 回收时,对应的 metaspace objects 被释放。 (从概念上讲,它就像终结器 free
-ing 元 space objects。)
When it reach this first high-water-mark should not it make it bigger next time until the max size?
显然不是。 HotSpot采集器的正常策略是这样的:
- 分配 objects 直到达到当前堆限制
- 运行收藏家
- 查看回收了多少 space,如果有必要,增加(或减少)堆大小。
这里好像也是用的一样的策略。完整的 GC 导致足够的 metaspace 被回收,它决定不需要扩展 metaspace.
A band-aid 将尝试将 -XX:MetaspaceSize
和 -XX:MaxMetaspaceSize
设置为相同的值,但这只会降低完整 GC 的频率。
一个真正的解决方案是弄清楚是什么在消耗元数据space,然后修复它。