CentOS Java内存配置技巧
-Xms(初始堆内存)和-Xmx(最大堆内存)是Java内存配置的基础,用于控制JVM堆的初始大小和最大可扩展大小。建议两者设置为相同值(如-Xms2g -Xmx2g),避免堆频繁扩容带来的性能开销。设置时需预留10%-20%内存给操作系统及非堆空间(如元空间、线程栈),防止系统内存耗尽。
-Xmn直接设置新生代大小(如-Xmn1g),或通过-XX:NewRatio设置新生代与老年代的比例(如-XX:NewRatio=3表示新生代占堆的1/4)。新生代过大可能导致老年代空间不足,过小则会增加Minor GC频率。-XX:SurvivorRatio调整Eden区与Survivor区的比例(如-XX:SurvivorRatio=8表示Eden区占新生代的8/10,每个Survivor区占1/10)。合理的比例能减少对象晋升到老年代的次数。Java 8及以上版本用元空间替代永久代,用于存储类元数据。需设置初始大小(-XX:MetaspaceSize,如256m)和最大大小(-XX:MaxMetaspaceSize,如512m),避免元空间溢出(默认无上限,可能导致系统内存耗尽)。
根据应用特点选择合适的垃圾回收器,通过-XX:+UseXXXGC参数开启:
-XX:+PrintGCDetails(打印详细GC日志)、-XX:+PrintGCDateStamps(添加时间戳)、-Xloggc:/path/to/gc.log(指定日志路径),便于分析GC频率、耗时及内存泄漏问题。-XX:+HeapDumpOnOutOfMemoryError在发生内存溢出时自动生成堆转储文件,-XX:HeapDumpPath=/path/to/dump.hprof指定保存路径,帮助定位内存泄漏点。-Xss设置每个线程的栈大小(如-Xss512k,默认1M),减小栈大小可增加线程数量,但过小可能导致StackOverflowError。启动Java应用时直接添加参数,适用于临时测试:
java -Xms512m -Xmx2g -Xmn1g -XX:+UseG1GC -jar your-app.jar
export JAVA_OPTS="-Xms512m -Xmx2g"。~/.bashrc(用户级)或/etc/profile(系统级),执行source ~/.bashrc使更改生效。启动应用时使用java $JAVA_OPTS -jar your-app.jar。若应用通过systemd管理(如your-app.service),编辑服务文件:
sudo vi /etc/systemd/system/your-app.service
在[Service]部分添加:
Environment="JAVA_OPTS=-Xms2g -Xmx2g -XX:+UseG1GC"
ExecStart=/usr/bin/java $JAVA_OPTS -jar /path/to/your-app.jar
执行sudo systemctl daemon-reload重新加载配置,sudo systemctl restart your-app重启服务。
-Xmx不应超过系统可用物理内存的70%(需预留内存给操作系统、数据库等其他进程),否则可能导致系统OOM Killer终止Java进程。free -h(查看系统内存)、jstat -gc <pid>(查看GC情况)、VisualVM(图形化监控)等工具持续监控内存使用,根据实际情况调整参数。