Ubuntu上Java虚拟机(JVM)参数设置指南
在设置JVM参数前,需确保Ubuntu系统已安装JDK(推荐使用OpenJDK,如openjdk-11-jdk或openjdk-17-jdk)。通过以下命令安装:
sudo apt update
sudo apt install openjdk-11-jdk # 替换为所需版本
安装完成后,验证Java版本:
java -version
若需长期使用,建议配置JAVA_HOME环境变量(指向JDK安装路径,如/usr/lib/jvm/java-11-openjdk-amd64),并添加至~/.bashrc或/etc/environment文件,通过source命令使更改生效。
JVM参数分为堆内存、垃圾回收、线程栈、其他性能四大类,可通过命令行或环境变量两种方式设置。
-Xms<size>:设置JVM启动时的初始堆内存大小(如-Xms512m表示512MB),避免堆内存动态扩展带来的性能开销。-Xmx<size>:设置JVM最大堆内存大小(如-Xmx4g表示4GB),建议与-Xms设置为相同值(如-Xms4g -Xmx4g),减少堆扩容的停顿时间。-Xmn<size>:设置年轻代(Young Generation)大小(如-Xmn2g),年轻代是对象分配的主要区域,合理设置可减少Minor GC频率(通常占堆内存的1/3~1/2)。-XX:+UseParallelGC:并行垃圾回收器(默认),适用于多核处理器,追求高吞吐量(适合后台批处理应用)。-XX:+UseG1GC:G1垃圾回收器(推荐),适用于大内存(>4GB)和低延迟要求的应用(如Web服务),可设置最大停顿时间(如-XX:MaxGCPauseMillis=200,单位毫秒)。-XX:+UseZGC:ZGC垃圾回收器(实验性),适用于超大内存(TB级别),停顿时间<10ms(需JDK 11+,开启-XX:+UnlockExperimentalVMOptions)。-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log
日志文件可用于后续分析(如使用GCViewer工具)。-Xss<size>:设置每个线程的栈内存大小(如-Xss1m表示1MB,默认通常为1MB)。若应用存在大量线程或深度递归调用,可适当增大该值(如-Xss2m),但过大会增加内存消耗。-XX:NewRatio=<ratio>:设置年轻代与老年代的比例(如-XX:NewRatio=2表示年轻代占堆的1/3,老年代占2/3)。若应用创建大量短期对象,可减小该值(如-XX:NewRatio=1)。-XX:SurvivorRatio=<ratio>:设置Eden区与Survivor区的比例(如-XX:SurvivorRatio=8表示Eden区占年轻代的8/10,每个Survivor区占1/10)。合理设置可减少对象晋升到老年代的频率。适用于单次运行Java应用,例如:
java -Xms512m -Xmx4g -Xmn2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar MyApp.jar
通过设置JAVA_OPTS环境变量,避免每次启动应用时手动输入参数:
~/.bashrc(当前用户)或/etc/environment(全局)文件:sudo nano /etc/environment
JAVA_OPTS="-Xms512m -Xmx4g -Xmn2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
source /etc/environment
java $JAVA_OPTS -jar MyApp.jar
若应用运行在容器(如Tomcat)中,需修改容器的启动脚本:
bin/catalina.sh文件(Linux系统):sudo nano /opt/tomcat/bin/catalina.sh
export JAVA_OPTS="-Xms512m -Xmx4g -Xmn2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
sudo systemctl restart tomcat
使用以下命令查看JVM参数设置:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|ThreadStackSize|GC'
输出结果会显示当前生效的堆内存、线程栈及GC参数。
jstat:监控GC情况(每1秒输出一次,共10次):jstat -gc <pid> 1000 10
其中<pid>为Java应用的进程ID(通过jps命令获取)。jmap:查看堆内存详情(如对象分布):jmap -heap <pid>
jstack:查看线程堆栈(排查死锁或线程阻塞):jstack <pid>
-Xmx不宜超过系统可用内存的70%(需预留系统和其他应用的内存),否则可能导致系统OOM(Out of Memory)。