XX:MaxMetaspaceSize 的用处


问题描述

在工作过程中,遇到一个问题:SpringBoot 打包的可执行jar ,在重启或者发布的时候,会有多次的full GC。


一、现象

{Heap before GC invocations=4 (full 1):
 PSYoungGen      total 76288K, used 6533K [0x00000000fab00000, 0x0000000100000000, 0x0000000100000000)
  eden space 65536K, 0% used [0x00000000fab00000,0x00000000fab00000,0x00000000feb00000)
  from space 10752K, 60% used [0x00000000feb00000,0x00000000ff161468,0x00000000ff580000)
  to   space 10752K, 0% used [0x00000000ff580000,0x00000000ff580000,0x0000000100000000)
 ParOldGen       total 175104K, used 96K [0x00000000f0000000, 0x00000000fab00000, 0x00000000fab00000)
  object space 175104K, 0% used [0x00000000f0000000,0x00000000f0018010,0x00000000fab00000)
 Metaspace       used 20379K, capacity 21094K, committed 21248K, reserved 1067008K
  class space    used 2536K, capacity 2717K, committed 2816K, reserved 1048576K
2021-12-11T11:09:36.605+0800: 1.422: [Full GC (Metadata GC Threshold) [PSYoungGen: 6533K->0K(76288K)] [ParOldGen: 96K->6422K(175104K)] 6629K->6422K(251392K), [Metaspace: 20379K->20379K(1067008K)], 0.0299851 secs] [Times: user=0.13 sys=0.01, real=0.03 secs]

二、分析

通过现象中的 [Metaspace: 20379K->20379K(1067008K)]  
得出,full gc之后,Metaspace区没有释放空间,
且old区离最大配置还很远,所以怀疑是Metaspace区不够用了。

1.查看Metaspace

root@ps:/opt#  java -XX:+PrintFlagsInitial   # 需要配置环境变量
通过认证查找之后,可以算出
-XX:Metaspacesize为21720669B(大约20M)
查资料得出 ,在默认情况下,这个值大小根据不同的平台在12M到21M浮动

2.解决问题

既然知道是因为Metaspacesize空间不足引起的,故而我们在容器启动的时候设定Metaspacesize的值即可

总结

这就是为什么我们看到成熟项目的启动脚本里默认有Metaspacesize的原因。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值