Bru*_*nzo 1 java garbage-collection g1gc
我在使用 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]
Run Code Online (Sandbox Code Playgroud)
这需要很长时间,元空间每 20-30 分钟就会触发一次完整的垃圾回收。我是这样配置的:
"-XX:MaxMetaspaceSize=768M",
"-XX:MetaspaceSize=256M"
Run Code Online (Sandbox Code Playgroud)
但是每次达到256M~就会触发一次full gc。当它达到第一个高水位线时,它不应该在下一次将其变大直到最大尺寸吗?另外,元空间上的完整GC会触发旧一代上的完整GC吗?我在某处读到过,但我不确定。这使得 p99 响应时间比我预期的要长。
根据Triggering of gc on Metaspace memory in java 8,为了减少元空间的使用,需要进行完整的GC。
我的理解是元空间本身并不是垃圾收集的。相反,普通堆中的对象保存对元空间对象的特殊引用。当对象被GC收集时,相应的元空间对象被释放。(从概念上讲,它就像终结器,其中终结器正在free处理元空间对象。)
当它达到第一个高水位线时,它不应该在下一次将其变大直到最大尺寸吗?
显然不是。HotSpot 收集器的正常策略是这样的:
看来这里也使用了同样的策略。完整的 GC 导致足够的元空间被回收,因此它决定不需要扩展元空间。
对此的一个补救措施是尝试将-XX:MetaspaceSize和设置-XX:MaxMetaspaceSize为相同的值,但这只会降低完整 GC 的频率。
真正的解决方案是找出消耗元空间的内容并修复它。
| 归档时间: |
|
| 查看次数: |
9784 次 |
| 最近记录: |