-Xmx是限制JVM堆内存最大值的唯一核心参数,必须显式设置以避免容器中OOMKilled;需大写单位、建议与-Xms设为相同值,并协同控制元空间、直接内存等非堆区域。

-Xmx 是限制 JVM 堆内存最大值的唯一核心参数。
必须用 -Xmx 显式设置上限
堆内存是对象分配的主要区域,不设 -Xmx 会导致 JVM 按默认策略分配(通常为物理内存的 1/4),在容器中更可能误读宿主机内存,引发 OOMKilled。该参数必须在启动时指定,运行中不可更改。
- 语法严格:单位字母必须大写,例如 -Xmx2G 合法,-Xmx2g 无效
- 推荐与 -Xms 设为相同值,如 -Xms2G -Xmx2G,避免运行时扩容触发 GC 波动
- 超出该值会直接抛出 java.lang.OutOfMemoryError: Java heap space
不能只靠 -Xmx,还需协同控制其他内存区
进程总内存 = 堆 + 元空间 + 直接内存 + 线程栈 + CodeCache 等。仅设 -Xmx 无法防止整体内存超标。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 元空间泄漏风险高:加 -XX:MaxMetaspaceSize=256m 防止类加载失控
- 堆外内存易被忽略:加 -XX:MaxDirectMemorySize=512m 限制 DirectByteBuffer
- 线程多时栈开销大:高并发轻量服务可调 -Xss256k(默认约 1MB)
容器环境必须启用感知能力
Docker/K8s 中,旧版 JVM 不识别 cgroup 限制。JDK 8u191+ 或 JDK 10+ 默认开启 -XX:+UseContainerSupport,但需配合 -XX:MaxRAMPercentage 或显式 -Xmx 使用,不能依赖自动推导。
- 容器内存限制为 4GB 时,建议堆设为 2.5–3GB,预留空间给非堆区域
- 禁用 UseContainerSupport 会退回到按宿主机内存计算,风险极高










