目录
- 元空间的两个重要参数
元空间的两个重要参数
-XX:MetaspaceSize=128m # 这不是"初始大小",而是"GC触发线" ,当元空间使用量接近这个值时,触发GC尝试回收
-XX:MaxMetaspaceSize=512m # 这是元空间绝对不能超过的限制,达到这个限制会触发Full GC,如果还不够就OOM
JVM的行为逻辑:
- 应用启动,加载所有必要的类
- 假如实际需要 ~130MB 元空间存储类元数据
- JVM提交刚好够用的内存 (MC ≈ 130MB)
- 参数只影响"何时GC"和"最大限制",不改变实际需求
jstat显示的是jvm提交的内存,参数设置的"何时GC"和"最大限制"在jstat的输出中并没有显示。
关键概念:jstat显示的是实际状态,参数设置的是行为规则
# jstat -gc 显示的实际数据:
MC = 131072 KB # JVM实际提交的内存(可测量)
MU = 126000 KB # 实际使用的内存(可测量)# 参数设置的行为规则:
-XX:MetaspaceSize=256m # GC触发规则(不可直接测量)
-XX:MaxMetaspaceSize=512m # 增长上限规则(不可直接测量)# 参数在jstat中的"间接"体现
# 当MU接近MetaspaceSize时,会看到GC活动:
jstat -gcutil输出:M YGC FGC95.2 150 5 # 使用率95%,但还没触发48.1 151 6 # 使用率骤降 → 发生了元空间GC!# 间接证据:FGC增加 + M列突然下降
# MetaspaceSize: 第一道防线 警戒水位线 - 水位达到这里时,开始泄洪(GC)
- 早期预警,尝试温和回收
- 防止问题恶化# MaxMetaspaceSize: 最后防线 大坝高度 - 水位绝对不能超过这里,否则溃坝(OOM)
- 防止系统内存被耗尽
- 提供明确的失败点
# MetaspaceSize设置:
- 比预期稳定使用量高20-30%
- 提供缓冲空间,避免频繁GC# MaxMetaspaceSize设置:
- 为未来增长留出空间
- 防止影响系统其他部分
- 通常为MetaspaceSize的1.5-2倍
参数 | 作用 | 默认值 | 相当于 |
---|---|---|---|
-XX:MetaspaceSize |
GC触发阈值 | ~21MB | "高水位线"、"警报线" |
-XX:MaxMetaspaceSize |
硬性上限 | 无限制 | "天花板"、"最大限制" |
元空间使用量增长↓┌─ 使用量 < MetaspaceSize >充足? ─┐↓ ↓否 是↓ ↓
触发元空间GC 正常使用,不触发GC↓
回收死类元数据↓┌─ 回收后使用量 < MaxMetaspaceSize >充足? ─┐↓ ↓是 否↓ ↓
继续正常运行 触发Full GC → 仍不够 → OOM