jvm内存结构由堆、方法区(元空间)、虚拟机栈、本地方法栈和程序计数器组成;其中堆和元空间线程共享,其余线程私有;jdk 8+以元空间替代永久代,需通过-xms/-xmx等参数调优堆,-xx:maxmetaspacesize限制元空间,-xss控制栈大小。

堆内存大小控制(最常用)
堆是对象分配主区域,也是GC重点管理区。必须同时设置初始值和最大值,避免运行时动态扩容带来的停顿。
- -Xms:初始堆大小,建议与 -Xmx 相同(尤其生产环境),防止堆震荡
- -Xmx:最大堆大小,不应超过物理内存的75%,需预留系统和其他进程空间
- -Xmn:年轻代大小,直接影响 Minor GC 频率;若未设,JVM按 -XX:NewRatio 默认比例(如1:2)自动划分
- -XX:NewRatio=N:老年代与年轻代容量比,例如 -XX:NewRatio=2 表示老年代 : 年轻代 = 2 : 1
- -XX:SurvivorRatio=N:Eden 与一个 Survivor 区的大小比,如 -XX:SurvivorRatio=8 表示 Eden:S0:S1 = 8:1:1
元空间(Metaspace)调优(JDK 8+)
JDK 8起取消永久代(PermGen),改用本地内存管理的元空间。它默认无上限,可能引发本地内存耗尽,需显式限制。
- -XX:MaxMetaspaceSize:元空间最大容量,必须设置(如 -XX:MaxMetaspaceSize=256m),否则可能无限增长
- -XX:MetaspaceSize:触发首次元空间GC的阈值,默认约20–24MB;设高些可减少早期GC
- -XX:MinMetaspaceFreeRatio 和 -XX:MaxMetaspaceFreeRatio:控制GC后空间收缩/扩张策略(高级调优项)
线程栈与直接内存设置
每个线程独占栈空间,过多线程或过大栈易导致 OOM;NIO 使用的直接内存也需约束。
- -Xss:每个线程的虚拟机栈大小,默认值因平台而异(Linux 64位通常为1MB)。高并发应用可适当调低(如 -Xss256k),但过小会引发 StackOverflowError
- -XX:ThreadStackSize:等价于 -Xss,语义相同
- -XX:MaxDirectMemorySize:限制 NIO Direct Buffer 总大小,默认等于 -Xmx;若大量使用 ByteBuffer.allocateDirect(),需单独设限(如 -XX:MaxDirectMemorySize=512m)
非堆其他区域说明
程序计数器、本地方法栈无直接参数可调——它们由JVM内部按需分配,大小与线程数和调用深度相关,用户不可控。方法区中的 CodeCache(JIT 编译代码缓存)可通过 -XX:ReservedCodeCacheSize 和 -XX:InitialCodeCacheSize 调整,但一般无需干预,除非频繁触发 JIT 编译或出现 CodeCache 满日志。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











