深入理解JVM - JVM常用命令

Linux 使用 appuser執(zhí)行命令

sudo -u appuser jps

JVM 常用命令

  • jps(JVM Process Status Tool):顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程
  • jstat(JVM Statistics Monitoring Tool):用戶收集HotSpot虛擬機(jī)各方面的運行數(shù)據(jù)
  • jinfo(Configuration Info for Java):實時查看和調(diào)整虛擬機(jī)各項參數(shù),在JDK9中集成到了jhsdb
  • jmap(Memory Map for java):生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲快照,在JDK9中集成到了jhsdb
  • jhat(JVM Heap Dump Browser):用戶分析heapdump文件,它會建立一個HTTP/HTML服務(wù)器成黄,讓用戶可以在瀏覽器上查看分析結(jié)果,在JDK9中集成到了jhsdb
  • jstack(Stack Trace for Java):生成虛擬機(jī)當(dāng)前時刻的線程快照唆途,在JDK9中集成到了jhsdb
  • jhsdb(Java HotSport Debugger):進(jìn)程調(diào)試器,在JDK9引入

jps

列出當(dāng)前機(jī)器上正在運行的虛擬機(jī)進(jìn)程,jps命令格式:

jps [option] [hostid]

-p: 僅僅顯示VM 標(biāo)示届案,不顯示jar,class, main參數(shù)等信息.
-m: 輸出主函數(shù)傳入的參數(shù). 下的hello 就是在執(zhí)行程序時從命令行輸入的參數(shù)
-l: 輸出應(yīng)用程序主類完整package名稱或jar完整名稱.
-v: 列出jvm參數(shù)

執(zhí)行樣例:

C:\Users\yuhao.wang3>jps -l
11824 sun.tools.jps.Jps
9860 org.jetbrains.idea.maven.server.RemoteMavenServer
7960

jstat

是用于監(jiān)視虛擬機(jī)各種運行狀態(tài)信息的命令行工具。它可以顯示本地或者遠(yuǎn)程虛擬機(jī)進(jìn)程中的類裝載罢艾、內(nèi)存楣颠、垃圾收集、JIT編譯等運行數(shù)據(jù)咐蚯,在沒有GUI圖形界面童漩,只提供了純文本控制臺環(huán)境的服務(wù)器上,它將是運行期定位虛擬機(jī)性能問題的首選工具春锋。

jstat [ option pid [interval[s|ms] [count]] ]
image.png

假設(shè)需要每250毫秒查詢一次進(jìn)程9860垃圾收集狀況矫膨,一共查詢5次,那命令應(yīng)當(dāng)是:

C:\Users\yuhao.wang3>jstat -gc 9860 250 5
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
10752.0 10752.0  0.0    0.0   64512.0   867.6    76800.0     8207.2   23808.0 22909.2 3072.0 2769.6      6    0.049   4      0.209    0.258
  • S0C:表示S0區(qū)域總大小
  • S0U:表示S0區(qū)域已使用大小

jinfo

查看和修改虛擬機(jī)的參數(shù)看疙,命令格式:

jinfo [option] pid

jinfo –sysprops 可以查看由System.getProperties()取得的參數(shù)
jinfo –flag 未被顯式指定的參數(shù)的系統(tǒng)默認(rèn)值
jinfo –flags(注意s)顯示虛擬機(jī)的參數(shù)
jinfo –flag +[參數(shù)] 可以增加參數(shù)豆拨,但是僅限于由java -XX:+PrintFlagsFinal –version查詢出來且

執(zhí)行示例:

C:\Users\yuhao.wang3>jinfo -flags 9860
Attaching to process ID 9860, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=264241152 -XX:MaxHeapSize=805306368 -XX:MaxNewSize=268435456 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88080384 -XX:OldSize=176160768 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Command line:  -Djava.awt.headless=true -Didea.version==2018.3.2 -Xmx768m -Didea.maven.embedder.version=3.3.9 -Dfile.encoding=GBK

jmap

用于生成堆轉(zhuǎn)儲快照(一般稱為heapdump或dump文件)。jmap的作用并不僅僅是為了獲取dump文件能庆,它還可以查詢finalize執(zhí)行隊列、Java堆和永久代的詳細(xì)信息脚线,如空間使用率搁胆、當(dāng)前用的是哪種收集器等。和jinfo命令一樣,jmap有不少功能在Windows平臺下都是受限的渠旁,除了生成dump文件的-dump選項和用于查看每個類的實例攀例、空間占用統(tǒng)計的-histo選項在所有操作系統(tǒng)都提供之外,其余選項都只能在Linux/Solaris下使用顾腊,命令格式:

jmp [option] pid
image.png

生成堆的轉(zhuǎn)存文件:

C:\Users\yuhao.wang3>jmap -dump:live,format=b,file=heap.bin 9860
Dumping heap to C:\Users\yuhao.wang3\heap.bin ...
Heap dump file created

jhat

虛擬機(jī)堆轉(zhuǎn)儲快照分析工具

分析剛剛生成的文件:

C:\Users\yuhao.wang3>jhat C:\Users\yuhao.wang3\heap.bin
Reading from C:\Users\yuhao.wang3\heap.bin...
Dump file created Tue Jan 14 17:59:13 CST 2020
Snapshot read, resolving...
Resolving 151163 objects...
Chasing references, expect 30 dots..............................
Eliminating duplicate references..............................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

屏幕顯示“Server is ready.”的提示后粤铭,用戶在瀏覽器中輸入http://localhost:7000/可以看到分析結(jié)果,拖到最下面杂靶,主要看"HeapHistogram"梆惯。

jstack

jstack(Stack Trace for Java)命令用于生成虛擬機(jī)當(dāng)前時刻的線程快照。線程快照就是當(dāng)前虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合吗垮,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因垛吗,如線程間死鎖死循環(huán)烁登、請求外部資源導(dǎo)致的長時間等待等都是導(dǎo)致線程長時間停頓的常見原因怯屉,命令格式:

jstack [option] pid

-F:當(dāng)正常輸出的請求不被響應(yīng)時,強(qiáng)制輸出線程堆棧
-l:除堆棧外饵沧,顯示關(guān)于鎖的附加信息
-m:如果調(diào)用到本地方法的話锨络,可以顯示C/C++的堆棧

查詢死循環(huán)示例:

public class JstackDeadWhileTest {

    public static void main(String[] args) {
        int i = 1;
        while (++i > 0) {
            System.out.println(i);
        }
    }
}
C:\Users\yuhao.wang3>jps -l
18244 com.xiaolyuh.JstackDeadWhileTest
5444 org.jetbrains.jps.cmdline.Launcher
7960
10252 sun.tools.jps.Jps
17324 org.jetbrains.kotlin.daemon.KotlinCompileDaemon

C:\Users\yuhao.wang3>jstack -F 18244
Attaching to process ID 18244, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
Deadlock Detection:

No deadlocks found.

Thread 14: (state = BLOCKED)


Thread 13: (state = BLOCKED)


Thread 12: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=143 (Interpreted frame)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=164 (Interpreted frame)
 - java.lang.ref.Finalizer$FinalizerThread.run() @bci=36, line=209 (Interpreted frame)


Thread 11: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
 - java.lang.Object.wait() @bci=2, line=502 (Interpreted frame)
 - java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Interpreted frame)
 - java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Interpreted frame)


Thread 5: (state = IN_NATIVE)
 - java.io.FileOutputStream.writeBytes(byte[], int, int, boolean) @bci=0 (Compiled frame; information may be imprecise)
 - java.io.FileOutputStream.write(byte[], int, int) @bci=8, line=326 (Compiled frame)
 - java.io.BufferedOutputStream.flushBuffer() @bci=20, line=82 (Compiled frame)
 - java.io.BufferedOutputStream.flush() @bci=1, line=140 (Compiled frame)
 - java.io.PrintStream.write(byte[], int, int) @bci=30, line=482 (Compiled frame)
 - sun.nio.cs.StreamEncoder.writeBytes() @bci=120, line=221 (Compiled frame)
 - sun.nio.cs.StreamEncoder.implFlushBuffer() @bci=11, line=291 (Compiled frame)
 - sun.nio.cs.StreamEncoder.flushBuffer() @bci=15, line=104 (Compiled frame)
 - java.io.OutputStreamWriter.flushBuffer() @bci=4, line=185 (Compiled frame)
 - java.io.PrintStream.write(java.lang.String) @bci=27, line=527 (Compiled frame)
 - java.io.PrintStream.print(int) @bci=5, line=597 (Compiled frame)
 - java.io.PrintStream.println(int) @bci=6, line=736 (Compiled frame)
 - com.xiaolyuh.JstackDeadWhileTest.main(java.lang.String[]) @bci=13, line=14 (Compiled frame)

在代碼中可以用java.lang.Thread類的getAllStackTraces()方法用于獲取虛擬機(jī)中所有線程的StackTraceElement對象。使用這個方法可以通過簡單的幾行代碼就完成jstack的大部分功能狼牺,在實際項目中不妨調(diào)用這個方法做個管理員頁面足删,可以隨時使用瀏覽器來查看線程堆棧。

性能監(jiān)控和故障處理工具

image.png

VisualVM:多合-故障處理工具

直接運行命令jvisualvm就可以打開VisualVM工具了锁右。

插件安裝

先去這個地址找到對應(yīng)版本的插件地址(https://xxx/updates.xml.gz):
https://visualvm.github.io/pluginscenters.html

image.png
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末失受,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咏瑟,更是在濱河造成了極大的恐慌拂到,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件码泞,死亡現(xiàn)場離奇詭異兄旬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)余寥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門领铐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人宋舷,你說我怎么就攤上這事绪撵。” “怎么了祝蝠?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵音诈,是天一觀的道長幻碱。 經(jīng)常有香客問我,道長细溅,這世上最難降的妖魔是什么褥傍? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮喇聊,結(jié)果婚禮上恍风,老公的妹妹穿的比我還像新娘。我一直安慰自己誓篱,他們只是感情好朋贬,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著燕鸽,像睡著了一般兄世。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上啊研,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天御滩,我揣著相機(jī)與錄音,去河邊找鬼党远。 笑死削解,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沟娱。 我是一名探鬼主播氛驮,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼济似!你這毒婦竟也來了矫废?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤砰蠢,失蹤者是張志新(化名)和其女友劉穎蓖扑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台舱,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡律杠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了竞惋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柜去。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拆宛,靈堂內(nèi)的尸體忽然破棺而出嗓奢,到底是詐尸還是另有隱情,我是刑警寧澤胰挑,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布蔓罚,位于F島的核電站椿肩,受9級特大地震影響瞻颂,放射性物質(zhì)發(fā)生泄漏豺谈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一贡这、第九天 我趴在偏房一處隱蔽的房頂上張望茬末。 院中可真熱鬧,春花似錦盖矫、人聲如沸丽惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽责掏。三九已至,卻和暖如春湃望,著一層夾襖步出監(jiān)牢的瞬間换衬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工证芭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瞳浦,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓废士,卻偏偏與公主長得像叫潦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子官硝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348