在 Ubuntu 上调整 Java 内存(JVM 堆内存),主要取决于你是以什么方式运行 Java 程序(命令行、Tomcat、Spring Boot、Docker 等)。下面按常见场景详细说明。
-Xms512m # 初始堆内存
-Xmx2048m # 最大堆内存
-XX:PermSize=256m # JDK7 及以前(永久代)
-XX:MaxPermSize=512m
JDK8 及以后: 永久代(PermGen)被 Metaspace 取代:
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
java -Xms1g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -jar app.jar
java -Xms512m -Xmx1024m MainClass
java -Xms512m -Xmx1024m -jar spring-app.jar
或:
export JAVA_OPTS="-Xms512m -Xmx1024m"
java $JAVA_OPTS -jar spring-app.jar
catalina.shsudo nano /opt/tomcat/bin/catalina.sh
添加:
export JAVA_OPTS="-Xms1g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
或(推荐方式):
CATALINA_OPTS="-Xms1g -Xmx2g"
假设服务文件:
/etc/systemd/system/app.service
修改:
[Service]
Environment="JAVA_OPTS=-Xms512m -Xmx1024m"
ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/app/app.jar
然后:
sudo systemctl daemon-reload
sudo systemctl restart app
java -XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -jar app.jar
或:
java -Xmx512m -jar app.jar
❌ 不推荐只设置 -Xmx,否则容器内存限制可能不生效。
ps -ef | grep java
jcmd <pid> VM.flags
jinfo -flags <pid>
java -Xlog:gc* -jar app.jar
jstat -gc <pid> 1000
free -h
ulimit -v
ulimit -m
⚠ 容器或云服务器常见坑点:
buff/cache 占用是正常现象-Xms1g
-Xmx2g
-Xms2g
-Xmx4g
-Xms 和 -Xmx 设置成一样,避免动态扩容抖动-XX:+UseG1GC
❌ 设置 -Xmx 超过系统可用内存
❌ Docker 中没开容器支持
❌ 忘了重启服务
❌ 把 JAVA_OPTS 写错位置(Tomcat)
如果你愿意,可以告诉我:
我可以给你 一份完全贴合你环境的 JVM 内存配置方案。