記一次JVM常用的指令(one)

                                    那人卻在燈火闌珊處

題記 : 最近把同事的書 : 深入理解Java虛擬機(第二版,周志明);然後結合網上一些博客的說明,似懂非懂,有些地方還是要深入,目前還沒看完,看下有望在這個月內看完.

好啦,廢話少說,進入到主題來進行記錄.

在線上環境是不存在用戶界面的只有命令行界面,所以我們使用JMX在使用類似jconsole、jvisualvm(包括插件)這樣的界面化程序進行調試實不可取的,只能使用多種命令結合的方式進行。

常用指令介紹 : 

  1 jps 

  jps命令主要用於查看有權訪問的hotspot虛擬機下工作的java進程(默認爲本操作系統),以及進程編號。使用方式如下:

usage jps [-help]

          jps [-q] [-mlvV][<hostid>]

 

比如:

3248 Jps
26327 Launcher
18632 RemoteMavenServer
4825 Main

 

jps可以使用的參數包括:

   -q :僅僅顯示VM 標示,不顯示jar,class, main參數等信息.

   m:輸出當運行java進程主方法時,操作者傳入的參數.

   l: 輸出應用程序主類完整package名稱或jar完整名稱。實例如下:

 

jps -l
26327 org.jetbrains.jps.cmdline.Launcher
18632 org.jetbrains.idea.maven.server.RemoteMavenServer
4825 com.intellij.idea.Main
3851 sun.tools.jps.Jps

 

jps -v   列出Jvm參數

3937 Jps -Dapplication.home=/usr/lib/jvm/jdk1.8.0_211 -Xms8m
26327 Launcher -Xmx700m -Djava.awt.headless=true -Djava.endorsed.dirs="" -Djdt.compiler.useSingleThread=true -Dpreload.project.path=/home/adetam/Desktop/vue_self_gavin/thread-learn-case -Dpreload.config.path=/home/adetam/.IntelliJIdea2019.1/config/options -Dcompile.parallel=false -Drebuild.on.dependency.change=true -Djava.net.preferIPv4Stack=true -Dio.netty.initialSeedUniquifier=-3670669770720620027 -Dfile.encoding=UTF-8 -Duser.language=en -Duser.country=US -Didea.paths.selector=IntelliJIdea2019.1 -Didea.home.path=/opt/idea-IU-191.7479.19 -Didea.config.path=/home/adetam/.IntelliJIdea2019.1/config -Didea.plugins.path=/home/adetam/.IntelliJIdea2019.1/config/plugins -Djps.log.dir=/home/adetam/.IntelliJIdea2019.1/system/log/build-log -Djps.fallback.jdk.home=/opt/idea-IU-191.7479.19/jre64 -Djps.fallback.jdk.version=1.8.0_202-release -Dio.netty.noUnsafe=true -Djava.io.tmpdir=/home/adetam/.IntelliJIdea2019.1/system/compile-server/thread-learn-case_7a24a3cd/_temp_ -Djps.backward.ref.index.builder=true -Dkotlin.incremental.compilati
18632 RemoteMavenServer -Djava.awt.headless=true -Didea.version==2019.1.3 -Xmx768m -Didea.maven.embedder.version=3.6.1 -Dfile.encoding=UTF-8
4825 Main -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Dawt.useSystemAAFontSettings=lcd -Dsun.java2d.renderer=sun.java2d.marlin.MarlinRenderingEngine -Dsun.tools.attach.tmp.only=true -javaagent:/home/adetam/Desktop/doc_self/jar/jetbrains-agent.jar -XX:ErrorFile=/home/adetam/java_error_in_IDEA_%p.log -XX:HeapDumpPath=/home/adetam/java_error_in_IDEA.hprof -Didea.paths.selector=IntelliJIdea2019.1 -Djb.vmOptionsFile=/home/adetam/.IntelliJIdea2019.1/config/idea64.vmoptions -Didea.jre.check=true
 

 

  2 : jinfo

jinfo命令可以用來查看正在運行的java進程的運行參數和環境參數;在一些特定情況下,還可以在運行時修改部分參數。使用格式如下:

Usage:
    jinfo [option] <pid>
        (to connect to running process)
    jinfo [option] <executable <core>
        (to connect to a core file)
    jinfo [option] [server_id@]<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 帶上jps中的數字就可以看到參數設置:一種是系統環境參數,寧外一種是JVM參數

 

flags 使用該命令參數,打印當前指定java進程中已經設定的所有JVM參數信息。使用方式類似如下 

        : jinfo flags 家加上java進程號(不要使用linux進程號,不然是看不到信息的)

        : -flag <name> 如下 : 

          jinfo -flag MinHeapDeltaBytes 65646

         -XX:MinHeapDeltaByte=524288

 

-sysprops : 使用該命令參數,打印當前java進程中設定的系統環境參數(在強調下:是java進程數字)

              jinfo -sysprops 18632  下面是節省了一部分信息

Attaching to process ID 18632, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 25.144-b01

 

-flag [+|-] <name> : 

       通過該命令參數,可以更改標記類型爲“manageable”,且設置值爲“bool”型的參數值,使用示例如下:

       jinfo -flag +PrintGC 18632

 

-flag <name>=<value>

通過該命令參數,可以爲一些JVM參數設定新的值,使用示例如下:

 

  3 : jmap 命令

      jmap命令最大的作用是生成當前指定的Java進程的dump文件,這個dump文件有利於在正式生成環境下觀察JVM運行的詳細情況,這樣才能着手找出可能的問題。jmap命令還可以查詢finalize執行隊列、Java堆的詳細信息,例如查看新生代目前使用的是哪種收集器。

  Usage : 

      jmap [option] <pid>

          (to connect to running process)

    jmap [option] <executable> (core)

          (to connect to a core file)

    jmap [option] [server_id@] <remote server IP or hostname>

      (to connect to remote debug server)

where <option> is one of:
<none>               to print same info as Solaris pmap
-heap                to print java heap summary
-histo[:live]        to print histogram of java object heap; if the "live"
suboption is specified, only count live objects
-clstats             to print class loader statistics
-finalizerinfo       to print information on objects awaiting finalization
-dump:<dump-options> to dump java heap in hprof binary format
dump-options:
live         dump only live objects; if not specified,
all objects in the heap are dumped.
format=b     binary format
file=<file>  dump heap to <file>
Example: jmap -dump:live,format=b,file=heap.bin <pid>
-F                   force. Use with -dump:<dump-options> <pid> or -histo
to force a heap dump or histogram when <pid> does not
respond. The "live" suboption is not supported
in this mode.
-h | -help           to print this help message
-J<flag>             to pass <flag> directly to the runtime system

jmap可以使用如上“jmap [option] [server_id@]<remote server IP or hostname>”的命令格式監控遠程服務器上的java進程信息,但是其最重要的還是option參數,我們首先介紹option參數的具體意義:

    -<none> 這個意思是說,jmap可以不加任何option參數信息,只是指定Java進程的進程號。這種情況下,jmap命令將按照Linux操作系統進程內存分析命令pmap的相關性,輸出內存分析結果。

    -heap 改參數將輸出當前指定java進程的堆內存概要信息。

    -clstats 該參數將打印出當前java進程中,存在的每個類加載器,以及通過該類加載器已經完成加載的各類信息,包括但不限於類加載器的活動情況、已經加載的類數量、關聯的父類加載器等等(class文件通過類加載器完成的載入、連接、驗證初始化等過程可以在這個命令的輸出詳情中具體體現出來)。

    finalizerinfo 該參數可打印出等待終結的對象信息,當Java進程在頻繁進行Full GC的時候,可以通過該命令獲取問題的排查依據。

    -histo[:live] 該參數可以輸出每個class的實例數目、內存佔用、類全名等信息。如果live子參數加上後,只統計活的對象數量。該命令非常有用,舉個例子,你可以使用該名了檢查軟件系統的某種設計模式是否符合設計預期。

    -dump:<dump-options> 該參數代表了jmap最重要的功能,取得當前指定java進程堆內存中各個class實例的詳細信息,並輸出到指定文件。dump命令還有三個子參數分別是。live只分析輸出目前有活動實例的class信息;format輸出格式,默認爲“b”,可以使用配套的分析軟件進行分析;file子參數可以指定輸出的文件,注意,如果輸出文件已經存在,則可以使用-F 參數來強制執行命令

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章