为了账号安全,请及时绑定邮箱和手机立即绑定

Java Metaspace Full GC

Java Metaspace Full GC

绝地无双 2021-12-22 19:28:06
我在使用 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~都会触发一次完整的gc。当它达到第一个高水位线时,它下次不应该让它变大直到最大尺寸吗?此外,元空间上的完整 gc 会触发旧 gen 上的完整 gc?我在某处读过它,但我不确定。这使 p99 响应时间比我预期的要高。
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

根据Triggering of gc on Metaspace memory in java 8,需要 full GC 以减少元空间使用。

我的理解是元空间本身不是垃圾收集的。取而代之的是,普通堆中的对象持有对元空间对象的特殊引用。当对象被 GC 收集时,相应的元空间对象被释放。(从概念上讲,它就像终结器正在free对元空间对象进行终结。)

当它达到第一个高水位线时,它下次不应该让它变大直到最大尺寸吗?

显然不是。HotSpot 收集器的正常策略是这样的:

  1. 分配对象,直到达到当前的堆限制

  2. 运行收集器

  3. 查看回收了多少空间,并在必要时增加(或减少)堆大小。

这里似乎使用了相同的策略。并且完整的 GC 导致足够的元空间被回收,它决定不需要扩展元空间。

对此的创可贴是尝试将-XX:MetaspaceSize和设置-XX:MaxMetaspaceSize为相同的值,但这只会降低完整 GC 的频率。

一个真正的解决方案是弄清楚是什么在消耗元空间,并修复它。


查看完整回答
反对 回复 2021-12-22
  • 1 回答
  • 0 关注
  • 234 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号