在 Java(JDK 8+)中,**元空间(Metaspace)**用于替代 JDK 7 及之前的永久代(PermGen),主要存放:
元空间默认使用的是本地内存(Native Memory),不受堆大小限制,但也不是“无限”的,调优不当会导致 Metaspace OOM 或内存浪费。
下面从 问题定位 → 关键参数 → 调优策略 → 实战建议 四个方面说明。
java.lang.OutOfMemoryError: Metaspace
-XX:MetaspaceSize=128m # 初始阈值,触发首次 GC
-XX:MaxMetaspaceSize=512m # 元空间最大上限(强烈建议设置)
⚠️ 不设置 MaxMetaspaceSize 很危险,可能吃光系统内存
-XX:MinMetaspaceFreeRatio=40
-XX:MaxMetaspaceFreeRatio=70
作用:
-XX:ClassUnloading=true
-XX:ClassUnloadingWithConcurrentMark=true
JDK 8 默认也能卸载类,但需 ClassLoader 可回收
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintMetaspaceStatistics
使用工具确认元空间使用情况:
jstat -gc <pid>jmap -clstats <pid>关注指标:
M 列(Metaspace 使用量)生产环境必配:
-XX:MaxMetaspaceSize=256m
根据经验:
| 应用类型 | 建议 MaxMetaspace |
|---|---|
| 普通 Spring Boot | 128–256m |
| 大型微服务 | 256–512m |
| 动态代理多 | 512m+ |
-XX:MetaspaceSize=128m
如果启动就加载大量类,建议:
-XX:MetaspaceSize=256m
常见泄漏场景:
✅ 解决方案:
如:
建议:
-XX:MaxMetaspaceSize=512m
并:
java -jar app.jar \
-Xms2g -Xmx2g \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=256m \
-XX:+PrintGCDetails \
-XX:+PrintMetaspaceStatistics
✅ 成功标志:
OutOfMemoryError: Metaspace❌ 失败信号:
元空间调优 = 设置上限 + 控制类生命周期 + 监控类数量
如果你愿意,可以:
我可以帮你做针对性调优方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。