JVM啟動的常用命令以及參數
在上文 JVM 堆內存邏輯分區 中已經使用過一些 jvm 啟動命令,本文著重講述JVM啟動命令用法以及一些常用的參數
一. 基本命令格式
java [options] classname [args...]
java [options] -jar filename.jar [args...]
① [options] - 命令行選項(可選)
比如標準參數 -version ,非標準參數 -Xms,非穩定參數 -XX:+PrintGCDetails,下面有詳細說明
② classname - 要執行的類(必需)
指定包含 main 方法的類的全限定名:
java com.example.MyApp
③ [args…] - 傳遞給 main 方法的參數(可選)
這些參數會傳遞給應用程序的 main 方法的 String[] args 參數:
java MyApp arg1 arg2 arg3
④ 完整示例
# 復雜的實際應用示例
java \-Xms1g -Xmx4g \ # 堆內存設置-XX:+UseG1GC \ # 使用 G1 垃圾收集器-XX:MaxGCPauseMillis=200 \ # 最大 GC 暫停時間-Dspring.profiles.active=prod \ # Spring 環境配置-Dlog4j.configurationFile=conf/log4j2.xml \ # 日志配置-cp "lib/*:app.jar:config" \ # 類路徑設置com.example.MainApplication \ # 主類--server.port=8080 \ # 應用參數--database.url=jdbc:mysql://localhost:3306/mydb
二. JVM 啟動常用命令參數分類
JVM 常用命令參數主要分為三類:
- 標準參數
以 - 開頭,是所有 JVM 實現必須支持的參數,例如:
-version:顯示版本信息
-help:顯示所有標準參數列表 - 非標準參數
以 -X 開頭,默認支持但可能不保證所有 JVM 實現兼容,例如:
-Xms:設置初始堆內存(如 -Xms512m) ?
-Xmx:設置最大堆內存(如 -Xmx2g) ?
-Xmn:設置新生代大小(如 -Xmn2g) - 非穩定參數
以 -XX 開頭,可能隨版本變更而取消,需謹慎使用,例如:
-XX:MetaspaceSize:設置元空間初始大小
-XX:+PrintGCDetails:輸出詳細 GC 日志 ?
三. 常用命令舉例
非穩定參數舉例
① java -XX:+PrintCommandLineFlags
主要作用是:在 JVM 啟動時,打印出那些被顯式設置或由 JVM 自動設置的關鍵 -XX 參數及其值。
java -XX:+PrintCommandLineFlags -version
C:\Users\Administrator>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=267006528 -XX:MaxHeapSize=4272104448 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
解讀:
- -XX:InitialHeapSize=267006528 ,JVM 根據當前機器的內存,自動設置的初始堆大小約為 255 MB。
- -XX:MaxHeapSize=4272104448 ,JVM 自動設置的最大堆大小約為 4 GB。(大概是電腦內存的 1/4)
- -XX:+PrintCommandLineFlags ,我們自己設置的參數也被打印出來了
- -XX:+UseCompressedClassPointers -XX:+UseCompressedOops,JVM 自動啟用了壓縮指針(64位系統上的優化,節省內存)。
- -XX:-UseLargePagesIndividualAllocation
- -XX:+UseParallelGC,JVM 自動選擇了并行垃圾收集器(Parallel GC)作為默認收集器。(這在JDK 8及之前是默認行為,高版本JDK默認可能是G1)
由上述 jvm 指令格式可知 classname 是必須參數,但是我們不需要運行某個類,只需要查看參數設置,那么添加 -version 參數可以告訴 JVM 不要嘗試執行任何應用程序,只需顯示版本信息然后退出
如果不加上 -version 會報如下錯:
② java -XX:+PrintFlagsInitial
查看所有不穩定指令的默認值
③ java -XX:+PrintFlagsFinal
查看所有不穩定指令最終生效的實際值
④ 打印GC日志
命令如下:
java -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log -jar yourapp.jar
- -XX:+PrintGC (或 -verbose:gc):表示開啟簡要 GC 日志。
- -XX:+PrintGCDetails:(強烈建議加上) 打印詳細的 GC 信息,包括各區(Eden, Survivor, Old)在 GC 前后的內存使用情況。沒有這個參數,日志信息會非常有限。
- -XX:+PrintGCDateStamps 或 -XX:+PrintGCTimeStamps:
- -XX:+PrintGCDateStamps:在日志中添加日期時間戳(如 2024-05-27T10:00:00.123+0800)。
- -XX:+PrintGCTimeStamps:在日志中添加從 JVM 啟動開始計算的相對時間戳(如 12.345 秒)。生產環境推薦使用 PrintGCDateStamps。
- -Xloggc:<file_path>:(強烈建議加上) 將 GC 日志輸出到文件,而不是控制臺。例如 -Xloggc:/logs/gc.log。
增加高級設置
java -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause -XX:+PrintTenuringDistribution -Xloggc:gc.log -jar yourapp.jar
- -XX:+PrintGCCause:打印觸發 GC 的原因(如 Allocation Failure, System.gc() 等)。這在 JDK 8 之后通常是默認開啟的。
- -XX:+PrintTenuringDistribution:打印晉升年齡閾值(對象在 Survivor 區熬過多少次 GC 才能進入老年代)的信息,對調優 Survivor 區大小非常有幫助。
- -XX:+PrintHeapAtGC:在每次 GC 前后打印堆的詳細信息。非常詳細,但日志量會急劇增大,主要用于深度調試。
- -XX:+PrintReferenceGC:打印處理各種引用(軟引用、弱引用、虛引用、Finalizer)的耗時。
⑤ 設置堆內存溢出時自動生成Dump文件
Dump 文件(轉儲文件)是計算機程序在特定時間點的狀態快照,它記錄了程序在發生錯誤、崩潰或特定觸發條件時的內存內容、執行狀態和系統信息,開發人員可以根據Dump文件事后分析到底發生了什么問題。
命令示例:
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -Xmx512m -jar yourapp.jar
- -XX:+HeapDumpOnOutOfMemoryError:啟用堆內存溢出時自動生成 dump 文件的功能
- -XX:HeapDumpPath=
:指定 dump 文件的保存路徑和文件名,可以指定文件名,也可以只指定目錄,當只指定目錄時,JVM 會自動生成文件名,格式為:java_pid.hprof