在 CentOS 上做 Java 内存调优,通常从 JVM 参数、系统资源、监控工具、应用本身 四个方面入手。下面给你一套实用、可操作的思路。
java -version
不同 JDK(8 / 11 / 17)默认 GC 和参数差异很大。
free -h
top
确认:
-Xms2g -Xmx2g
含义:
-Xms:初始堆-Xmx:最大堆✅ 建议:生产环境 Xms = Xmx,避免频繁扩容
示例(4G 服务器):
-Xms2g -Xmx2g
-XX:MaxDirectMemorySize=512m
用于:
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
防止:
-XX:+UseParallelGC
-XX:+UseG1GC
示例:
-Xms4g -Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200
-XX:+UseZGC
或
-XX:+UseG1GC
swapoff -a
或降低使用倾向:
sysctl vm.swappiness=10
ulimit -n 65535
修改:
/etc/security/limits.conf
net.core.somaxconn=1024
net.ipv4.tcp_tw_reuse=1
jstat -gcutil <pid> 1000
jmap -dump:format=b,file=heap.hprof <pid>
jstack <pid> > thread.txt
✅ 解决:
-XX:MaxMetaspaceSize=512m
并检查:
java -Xms4g -Xmx4g \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m \
-XX:MaxDirectMemorySize=512m \
-jar app.jar
如果你愿意,可以告诉我:
我可以直接给你 一套可落地的参数配置。