Java程式員有時候需要瞭解JVM相關的參數,不管是出於好奇或者工作需要。Oracle的文檔中列出了一些,(點擊這裡),單並不是全部,而且有些參數的設定會預設啟用或者關閉其他一些參數,而在某些情況下設定某個參數是不會生效的。還有些時候你想讓JVM做某些事情,但是你不知道那個參數可以用。下面介紹一些辦法用以列出所有參數,這樣你在研究或者Google的時候也比較有明確的目標。
如果你想查看一下線上正在啟動並執行JVM到底設定了那些參數,生效的是那些,可能用到的方法:
1. 在Linux下用ps命令找到啟動Java應用時的參數
ps -ef | grep "your java app name"
這個命令會打出你啟動Java應用時傳給java命令的所有參數,你可以看到裡面的JVM參數。
2.直接看啟動指令碼,或者參數配置
你未必能找到所有設定這JVM參數的地方,容易遺漏。
一般來講以上兩種辦法都需要對JVM了如指掌或者非常熟悉,至少對特定的參數。
其實JVM中有一個參數-XX:+PrintFlagsFinal,可以列印出幾乎所有的JVM支援的參數以及他們的預設值。如果你想要查看你的Java應用到底使用了那些參數,只要在啟動的時候加上這個參數就可以了。
1.查看你使用的JDK支援的參數
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version
2.列印Java應用啟用的JVM參數
java -XX:+PrintFlagsFinal -classpath=/path/to/your/libs MainClass
3.如果你的Java應用已經是運行狀態了,你想查看某個JVM參數生效沒有可以使用jinfo這個工具。比如說大名鼎鼎的G1記憶體回收行程,在JDK7update3中不論是用戶端(-client)還是伺服器(-server)模式下都不是預設啟動的。
jinfo是隨JDK一起發布的,使用時先用jps找到Java應用的pid。直接運行jinfo可以查看使用說明。
jinfo -flag UseParallelOldGC 31072
-XX:+UseParallelOldGC
JDK中實用的工具還很多,可以逐個的體驗一下${JAVA_HOME}/bin目錄中的每個命令,有驚喜。