天天看點

JVM性能監控工具 - jinfo

jinfo(Configuration Info For Java),檢視虛拟機配置的參數,也可以用于調整虛拟機的配置參數。在很多情況下,Java應用程式不會指定所有的Java虛拟機參數。而此時,開發人員可能不知道某一具體的Java虛拟機參數的預設值。這種情況下,可能需要通過檢視文檔才能夠擷取到參數的預設值。這個查找過程是非常麻煩的,但是有了jinfo工具,開發人員可以很友善的找到Java虛拟機的目前參數的預設值。

  • jinfo -help:(參數由option和pid構成)
    C:\Users\lenovo>jinfo -help
    Usage:
        jinfo [option] <pid>
            (to connect to running process)
        jinfo [option] <executable <core>
            (to connect to a core file)
        jinfo [option] [[email protected]]<remote server IP or hostname>
            (to connect to remote debug server)
    
    where <option> is one of:
        -flag <name>         to print the value of the named VM flag
        -flag [+|-]<name>    to enable or disable the named VM flag
        -flag <name>=<value> to set the named VM flag to the given value
        -flags               to print VM flags
        -sysprops            to print Java system properties
        <no option>          to print both of the above
        -h | -help           to print this help message
               
  • 檢視
    • jinfo -sysprops <pid>:可以檢視有System.getProperties( )擷取的參數
      C:\Users\lenovo>jinfo -sysprops 12320
      Attaching to process ID 12320, please wait...
      Debugger attached successfully.
      Server compiler detected.
      JVM version is 25.91-b15
      java.runtime.name = Java(TM) SE Runtime Environment
      java.vm.version = 25.91-b15
      sun.boot.library.path = D:\Java\jdk1.8.0_91\jre\bin
      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 =
      sun.java.launcher = SUN_STANDARD
      user.script =
      user.country = CN
      user.dir = E:\WorkingSpace\IdeaProjects\demo002
      java.vm.specification.name = Java Virtual Machine Specification
      java.runtime.version = 1.8.0_91-b15
      java.awt.graphicsenv = sun.awt.Win32GraphicsEnvironment
      os.arch = amd64
      java.endorsed.dirs = D:\Java\jdk1.8.0_91\jre\lib\endorsed
      visualvm.id = 2253270708934000
      line.separator =
      
      java.io.tmpdir = C:\Users\lenovo\AppData\Local\Temp\
      java.vm.specification.vendor = Oracle Corporation
      user.variant =
      os.name = Windows 10
      sun.jnu.encoding = GBK
      java.library.path = D:\Java\jdk1.8.0_91\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Python39\Scripts\;C:\Python39\;D:\Program Files (x86)\NetSarang\Xftp 6\;D:\Program Files (x86)\xshell\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;d:\Program Files\Git\cmd;%JAVA_HOME%\bin;%MAVEN_HOME%\bin;%CURL_HOME%\bin;%TOMCAT%\bin;D:\Program Files\Android\Sdk\platform-tools;%NGINX%;C:\ProgramData\chocolatey\bin;D:\Program Files (x86)\nodejs\;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Users\lenovo\AppData\Local\Microsoft\WindowsApps;d:\Program Files\JetBrains\IntelliJ IDEA 2020.2\bin;;D:\Program Files\apache-maven-3.6.3\bin;C:\Program Files\MySQL\MySQL Server 8.0\bin;D:\Java\jdk1.8.0_91\bin;;D:\Program Files\JetBrains\WebStorm 2021.1\bin;;C:\Users\lenovo\AppData\Roaming\npm;.
      java.specification.name = Java Platform API Specification
      java.class.version = 52.0
      sun.management.compiler = HotSpot 64-Bit Tiered Compilers
      os.version = 10.0
      user.home = C:\Users\lenovo
      user.timezone =
      java.awt.printerjob = sun.awt.windows.WPrinterJob
      file.encoding = UTF-8
      java.specification.version = 1.8
      user.name = lenovo
      java.class.path = D:\Java\jdk1.8.0_91\jre\lib\charsets.jar;D:\Java\jdk1.8.0_91\jre\lib\deploy.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_91\jre\lib\javaws.jar;D:\Java\jdk1.8.0_91\jre\lib\jce.jar;D:\Java\jdk1.8.0_91\jre\lib\jfr.jar;D:\Java\jdk1.8.0_91\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_91\jre\lib\jsse.jar;D:\Java\jdk1.8.0_91\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_91\jre\lib\plugin.jar;D:\Java\jdk1.8.0_91\jre\lib\resources.jar;D:\Java\jdk1.8.0_91\jre\lib\rt.jar;E:\WorkingSpace\IdeaProjects\demo002\target\classes;D:\.m2\repository\org\slf4j\jcl-over-slf4j\1.7.13\jcl-over-slf4j-1.7.13.jar;D:\.m2\repository\org\slf4j\slf4j-api\1.7.13\slf4j-api-1.7.13.jar;D:\.m2\repository\org\springframework\spring-core\5.2.9.RELEASE\spring-core-5.2.9.RELEASE.jar;D:\.m2\repository\org\springframework\spring-jcl\5.2.9.RELEASE\spring-jcl-5.2.9.RELEASE.jar;D:\.m2\repository\org\springframework\spring-beans\5.2.9.RELEASE\spring-beans-5.2.9.RELEASE.jar;D:\.m2\repository\org\springframework\spring-tx\5.2.9.RELEASE\spring-tx-5.2.9.RELEASE.jar;D:\.m2\repository\org\springframework\spring-context\5.2.9.RELEASE\spring-context-5.2.9.RELEASE.jar;D:\.m2\repository\org\springframework\spring-aop\5.2.9.RELEASE\spring-aop-5.2.9.RELEASE.jar;D:\.m2\repository\org\springframework\spring-expression\5.2.9.RELEASE\spring-expression-5.2.9.RELEASE.jar;D:\.m2\repository\org\springframework\spring-web\5.2.9.RELEASE\spring-web-5.2.9.RELEASE.jar;D:\.m2\repository\org\springframework\spring-context-support\5.2.9.RELEASE\spring-context-support-5.2.9.RELEASE.jar;D:\.m2\repository\javax\mail\mail\1.4.1\mail-1.4.1.jar;D:\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar;D:\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.8.0-M1\junit-jupiter-api-5.8.0-M1.jar;D:\.m2\repository\org\apiguardian\apiguardian-api\1.1.1\apiguardian-api-1.1.1.jar;D:\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;D:\.m2\repository\org\junit\platform\junit-platform-commons\1.8.0-M1\junit-platform-commons-1.8.0-M1.jar;D:\Program Files\JetBrains\IntelliJ IDEA 2018.2.5\lib\idea_rt.jar
      java.vm.specification.version = 1.8
      sun.arch.data.model = 64
      sun.java.command = com.booyue.tlh.gclog.TestJVMTools 1 2 3 4 5
      java.home = D:\Java\jdk1.8.0_91\jre
      user.language = zh
      java.specification.vendor = Oracle Corporation
      awt.toolkit = sun.awt.windows.WToolkit
      java.vm.info = mixed mode
      java.version = 1.8.0_91
      java.ext.dirs = D:\Java\jdk1.8.0_91\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
      sun.boot.class.path = D:\Java\jdk1.8.0_91\jre\lib\resources.jar;D:\Java\jdk1.8.0_91\jre\lib\rt.jar;D:\Java\jdk1.8.0_91\jre\lib\sunrsasign.jar;D:\Java\jdk1.8.0_91\jre\lib\jsse.jar;D:\Java\jdk1.8.0_91\jre\lib\jce.jar;D:\Java\jdk1.8.0_91\jre\lib\charsets.jar;D:\Java\jdk1.8.0_91\jre\lib\jfr.jar;D:\Java\jdk1.8.0_91\jre\classes
      java.vendor = Oracle Corporation
      file.separator = \
      java.vendor.url.bug = http://bugreport.sun.com/bugreport/
      sun.io.unicode.encoding = UnicodeLittle
      sun.cpu.endian = little
      sun.desktop = windows
      sun.cpu.isalist = amd64
                 
    • jinfo -flags <pid>:檢視曾經指派的一些參數
      C:\Users\lenovo>jinfo -flags 12320
      Attaching to process ID 12320, please wait...
      Debugger attached successfully.
      Server compiler detected.
      JVM version is 25.91-b15
      Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=20971520 -XX:MaxHeapSize=52428800 -XX:MaxNewSize=10485760 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=10485760 -XX:OldSize=10485760 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
      Command line:  -Dvisualvm.id=2253270708934000 -Xms20m -Xmx50m -Xmn10m -javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2018.2.5\lib\idea_rt.jar=64196:D:\Program Files\JetBrains\IntelliJ IDEA 2018.2.5\bin -Dfile.encoding=UTF-8
                 
    • jinfo -flag <具體參數> <pid>:檢視某個java程序具體參數的值(檢視系統是否啟用了并行垃圾收集器,結果顯示-XX:+UseParallelGC,說明系統啟用了并行的垃圾收集器)
      C:\Users\lenovo>jinfo -flag UseParallelGC 12320
      -XX:+UseParallelGC
                 
  • 修改(這裡需要注意的一點是,并非所有的參數都支援修改,隻有被标記為manageable的flag可以被實時修改:java -XX:+PrintFlagsFinal -version | grep manageable 可以檢視)
    [[email protected] ~]# java -XX:+PrintFlagsFinal -version | grep manageable
         intx CMSAbortablePrecleanWaitMillis            = 100                                 {manageable}
         intx CMSTriggerInterval                        = -1                                  {manageable}
         intx CMSWaitDuration                           = 2000                                {manageable}
         bool HeapDumpAfterFullGC                       = false                               {manageable}
         bool HeapDumpBeforeFullGC                      = false                               {manageable}
         bool HeapDumpOnOutOfMemoryError                = false                               {manageable}
        ccstr HeapDumpPath                              =                                     {manageable}
        uintx MaxHeapFreeRatio                          = 100                                 {manageable}
        uintx MinHeapFreeRatio                          = 0                                   {manageable}
         bool PrintClassHistogram                       = false                               {manageable}
         bool PrintClassHistogramAfterFullGC            = false                               {manageable}
         bool PrintClassHistogramBeforeFullGC           = false                               {manageable}
         bool PrintConcurrentLocks                      = false                               {manageable}
         bool PrintGC                                   = false                               {manageable}
         bool PrintGCDateStamps                         = false                               {manageable}
         bool PrintGCDetails                            = false                               {manageable}
         bool PrintGCID                                 = false                               {manageable}
         bool PrintGCTimeStamps                         = false                               {manageable}
    java version "1.8.0_191"
    Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
               
    • jinfo -flag [+/-]<具體參數> <pid> :針對boolean類型的值修改(先檢視了是否開啟了PrintGCDetails ,發現沒有開啟,接着開啟了PrintGCDetails )
      C:\Users\lenovo>jinfo -flag PrintGCDetails 26948
      -XX:-PrintGCDetails
      
      C:\Users\lenovo>jinfo -flag +PrintGCDetails 26948
      
      C:\Users\lenovo>jinfo -flag PrintGCDetails 26948
      -XX:+PrintGCDetails
                 
    • jinfo -flag <具體參數=具體參數值> <pid>:針對非boolea類型的值修改