Java的jinfo命令使用詳解

萬貓學社發表於2022-03-18

jinfo命令簡介

jinfo(Java Virtual Machine Configuration Information)是JDK提供的一個可以實時檢視Java虛擬機器各種配置引數和系統屬性的命令列工具。使用jps命令的-v引數可以檢視Java虛擬機器啟動時顯式指定的配置引數,如果想檢視沒有顯式指定的配置引數就可以使用jinfo命令進行檢視。另外,jinfo命令還可以查詢Java虛擬機器程式的System.getProperties()的內容。

在沒有dbgeng.dll的Windows系統中,必須安裝用於Windows的除錯工具才能使jinfo命令正常工作,PATH環境變數應該包含jvm.dll的位置。

jinfo命令引數

命令語法:

jinfo [option] pid

命令引數說明:

  • option:jinfo命令的可選引數。如果沒有指定這個引數,jinfo命令會顯示所有的配置引數和系統屬性。
  • pid:要列印配置資訊的Java虛擬機器的程式ID。

想要要獲取執行的Java虛擬機器程式的列表,可以使用ps命令(Linux系統中)或tasklist命令(Windows系統中),如果Java虛擬機器程式沒有在單獨的docker例項中執行,可以使用jps命令。

option都有哪些引數呢?我們來看一下。

-flag name

顯示指定名稱對應的配置引數,比如,檢視了簡單GC日誌模式(PrintGC)是否開啟:

# jinfo -flag PrintGC 15729
-XX:-PrintGC

-flag [+|-]name

啟用或禁用指定名稱的引數,該引數必須為Boolean型別。比如,開啟簡單GC日誌模式:

# jinfo -flag +PrintGC 15729
# jinfo -flag PrintGC 15729
-XX:+PrintGC

比如,禁用簡單GC日誌模式:

# jinfo -flag -PrintGC 15729
# jinfo -flag PrintGC 15729
-XX:-PrintGC

-flag name=value

不需要重啟Java虛擬機器,修改指定名稱的引數為指定的值。比如,修改空閒堆空間的最小百分比(MinHeapFreeRatio)為30%:

# jinfo -flag MinHeapFreeRatio 15729
-XX:MinHeapFreeRatio=40
# jinfo -flag MinHeapFreeRatio=30 15729
# jinfo -flag MinHeapFreeRatio 15729
-XX:MinHeapFreeRatio=30

當然不是所有引數都可以這樣修改的,比如併發垃圾收集器將使用的執行緒數(ConcGCThreads):

# jinfo -flag ConcGCThreads=5 15729
Exception in thread "main" com.sun.tools.attach.AttachOperationFailedException: flag 'ConcGCThreads' cannot be changed

        at sun.tools.attach.LinuxVirtualMachine.execute(LinuxVirtualMachine.java:229)
        at sun.tools.attach.HotSpotVirtualMachine.executeCommand(HotSpotVirtualMachine.java:261)
        at sun.tools.attach.HotSpotVirtualMachine.setFlag(HotSpotVirtualMachine.java:234)
        at sun.tools.jinfo.JInfo.flag(JInfo.java:134)
        at sun.tools.jinfo.JInfo.main(JInfo.java:81)

那麼,有哪些配置引數是支援動態修改的呢?我們可以通過java -XX:+PrintFlagsInitial命令找到標記為manageable的配置引數,執行結果如下圖所示:

萬貓學社.png

-flags

顯示全部的配置引數,比如:

# jinfo -flags 15729
Attaching to process ID 15729, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.251-b08
Non-default VM flags: -XX:CICompilerCount=4 -XX:ConcGCThreads=2 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=1073741824 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=536870912 -XX:MetaspaceSize=268435456 -XX:MinHeapDeltaBytes=1048576 -XX:MinHeapFreeRatio=30 -XX:NewSize=536870912 -XX:-PrintGC -XX:SurvivorRatio=4 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 
Command line:  -Xmx1g -Xms1g -Xmn512m -XX:SurvivorRatio=4 -XX:MetaspaceSize=256m -XX:+UseG1GC

-sysprops

以鍵值對的方式顯示當前Java虛擬機器的全部的系統屬性,比如:

# jinfo -sysprops 15729
Attaching to process ID 15729, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.251-b08
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.251-b08
sun.boot.library.path = /usr/local/java/jdk1.8.0_251/jre/lib/amd64
java.protocol.handler.pkgs = org.springframework.boot.loader
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = CN
java.vm.specification.name = Java Virtual Machine Specification
PID = 15729
java.runtime.version = 1.8.0_251-b08
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /usr/local/java/jdk1.8.0_251/jre/lib/endorsed
line.separator = 
......

-h 和 -help

顯示jinfo命令的幫助資訊。

結尾

雖然jinfo命令已經推出很久並且使用頻率比較搞,但它仍然是一個“實驗性質的,並且沒有技術支援的”(Experimental and Unsupported)工具,日後可能會被轉正,也有可能在某個JDK版本中無聲無息地消失。所以,且用且珍惜吧。

最後,謝謝你這麼帥,還給我點贊關注

微信公眾號:萬貓學社

微信掃描二維碼

關注後回覆「電子書」

獲取12本Java必讀技術書籍

Java的jinfo命令使用詳解

相關文章