那人卻在燈火闌珊處
題記 : 最近把同事的書 : 深入理解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 參數來強制執行命令