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)。