偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

JDK中自帶的JVM分析工具

開發(fā) 開發(fā)工具
對于JVM的監(jiān)控工具來說,其能力與常用的命令行語法差異很小,并且這些命令在jdk中tools.jar包也可以找到其對應(yīng)的類,對于一些更高級的監(jiān)控平臺(tái)來說,例如Kuboard、Skywalking等,也對這些底層能力做了集成,其原理應(yīng)該也是大同小異。

一、業(yè)務(wù)背景

對于分布式架構(gòu)中的文件服務(wù)來說,由于涉及大量的IO流操作,很容易引發(fā)JVM的相關(guān)異常,尤其是內(nèi)存溢出的問題;

圖片

在最近的一次版本迭代中,真實(shí)的業(yè)務(wù)處理場景和上述幾乎一致,由于在文件服務(wù)中添加批量處理的動(dòng)作,直接喚醒了隱藏許久的BUG,就是最常見的內(nèi)存溢出;

問題的起因:在word文檔完成內(nèi)容識別后,轉(zhuǎn)換為pdf文件,然后進(jìn)行頁面分割轉(zhuǎn)為一組圖片,在這個(gè)復(fù)雜并且超長的流程中存在一個(gè)數(shù)組容器未銷毀;

解決的方式:分析JVM的dump文件,定位OOM問題引發(fā)的根本原因,結(jié)合文件服務(wù)的異常日志分析,添加資源的釋放動(dòng)作,從而解決問題;

二、Jdk-Bin目錄

對于相當(dāng)一部分新手來說,看到JVM的問題都是Bug不知所起一臉懵的,其實(shí)這種心態(tài)大可不必,從職場幾年的開發(fā)經(jīng)驗(yàn)上看,JVM的問題大致分為兩種:

  • 開發(fā)輕松解決:可以升級內(nèi)存資源或者調(diào)整分配,又或者對程序優(yōu)化,完成相關(guān)資源的管理和釋放,這是最常用的手段;
  • 輕松解決開發(fā):由于經(jīng)驗(yàn)不足,程序出現(xiàn)重大BUG導(dǎo)致JVM異常,進(jìn)而引起系列的連鎖反應(yīng),這種不會(huì)絕地反彈,只有一地雞毛;

在解決常規(guī)的JVM異常時(shí),通常依賴JDK中基礎(chǔ)工具即可完成問題的定位,從而進(jìn)行分析和解決,不過這些需要對基礎(chǔ)工具熟練使用才行,而很多JDK自身的能力又是經(jīng)常被忽略的;

在jdk的bin目錄中,有很多自帶工具可以用于對JVM的分析;

圖片

上述是基于jdk1.8的目錄,里面有很多開發(fā)經(jīng)常用到命令,下面圍繞一個(gè)微服務(wù)的啟動(dòng)和運(yùn)行,來看看基于JDK中自帶JVM工具的用法;

三、命令行工具

1、jps命令

jps:虛擬機(jī)進(jìn)程狀態(tài)工具,該命令在Java環(huán)境部署和服務(wù)啟動(dòng)查看時(shí)經(jīng)常用到,首先在本地啟動(dòng)一個(gè)facade門面微服務(wù),然后在命令行中執(zhí)行查詢;

  • jps:命令默認(rèn)輸出的是進(jìn)程ID和應(yīng)用主類的名稱;
  • -l:輸出進(jìn)程ID和應(yīng)用主類的完整路徑;
  • -v:輸出向jvm傳遞的參數(shù),此處展示為idea中顯式配置的VM-options參數(shù),其他內(nèi)容自行查看即可;
  • -m:輸出向main方法傳遞的參數(shù),服務(wù)啟動(dòng)前可以在idea的Program-arguments配置;
$ jps
1281 FacadeApp

$ jps -l
1281 com.explore.facade.FacadeApp

$ jps -v
1281 FacadeApp -Xms128m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

$ jps -m
1281 FacadeApp hello,main-method

2、jinfo命令

jinfo:在命令后面帶pid進(jìn)程號,可以輸出指定進(jìn)程的配置信息,在應(yīng)用啟動(dòng)時(shí)通常不會(huì)指定過多的配置參數(shù),就可以使用該命令查詢很多參數(shù)的默認(rèn)值;該命令還可以在運(yùn)行時(shí)動(dòng)態(tài)調(diào)整部分參數(shù),只是很少被使用;

$ jinfo 1281            # 只粘貼個(gè)別參數(shù)
Java System Properties: # 系統(tǒng)參數(shù)
java.runtime.versinotallow=1.8.0_144-b01
file.encoding=UTF-8
sun.java.command=com.explore.facade.FacadeApp hello,main-method

VM Flags: # 虛擬機(jī)參數(shù)
-XX:InitialHeapSize=134217728 -XX:MaxHeapSize=268435456 -XX:MaxNewSize=267911168

VM Arguments: # 運(yùn)行時(shí)參數(shù)
jvm_args: -Xms128m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
java_command: com.explore.facade.FacadeApp hello,main-method

$ jinfo -sysprops 1281 # 只輸出【Java System Properties】參數(shù)

$ jinfo -flags 1281 # 只輸出【VM Flags】參數(shù)

3、jstat命令

jstat:以指定的頻率輸出JVM的監(jiān)控指標(biāo),下述命令輸出內(nèi)存占用和GC相關(guān)信息,每隔3秒輸出一次,連續(xù)打印5次;由于這里只是啟動(dòng)一個(gè)簡單的微服務(wù),沒有執(zhí)行業(yè)務(wù)邏輯,所以各項(xiàng)指標(biāo)比較平穩(wěn);

$ jstat -gcutil 1281 3000 5
S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT
0.00 0.00 57.97 64.16 92.82 88.75 3 0.028 9 0.516 - - 0.544
0.00 0.00 57.97 64.16 92.82 88.75 3 0.028 9 0.516 - - 0.544

該命令是比較常用的,這里各項(xiàng)指標(biāo)的統(tǒng)計(jì)邏輯,在tools.jar?包中有jstat_options?參考文檔,相對路徑sun/tools/jstat/resources/目錄下;

option gcutil {
column {
header "^S0^" /* Survivor 0 Space - Percent Used */
data (1-((sun.gc.generation.0.space.1.capacity - sun.gc.generation.0.space.1.used)/sun.gc.generation.0.space.1.capacity)) * 100
}
column {
header "^S1^" /* Survivor 1 Space - Percent Used */
data (1-((sun.gc.generation.0.space.2.capacity - sun.gc.generation.0.space.2.used)/sun.gc.generation.0.space.2.capacity)) * 100
}
......
}

4、jstack命令

jstack:輸出指定進(jìn)程當(dāng)前時(shí)刻在JVM中的線程信息,為了清楚的展示其效果,在服務(wù)啟動(dòng)時(shí)創(chuàng)建線程死鎖,然后通過該命令就會(huì)把發(fā)生死鎖的線程打印出來,通過輸出可以發(fā)現(xiàn)兩條互相等待的線程信息;

$ jstack 1281
Found one Java-level deadlock:
=============================
"test-thread-02":
waiting for ownable synchronizer 0x00000007b00a35d0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
which is held by "test-thread-01"
"test-thread-01":
waiting for ownable synchronizer 0x00000007b00a35a0, (a java.util.concurrent.locks.ReentrantLock$NonfairSync),
which is held by "test-thread-02"

Java stack information for the threads listed above:
===================================================
"test-thread-02":
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007b00a35d0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

"test-thread-01":
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007b00a35a0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

Found 1 deadlock.

5、jmap命令

jmap:可以輸出指定進(jìn)程的內(nèi)存中對象映射信息,或者堆的關(guān)鍵信息、內(nèi)存的使用統(tǒng)計(jì)、GC算法、配置、類的實(shí)例信息及內(nèi)存占用等,該命令在解決JVM問題時(shí)也經(jīng)常使用;

$ jmap 1281

$ jmap -heap 1281
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 536870912 (512.0MB)

Heap Usage:
PS Young Generation
Eden Space:
From Space:
To Space:
PS Old Generation

$ jmap -histo:live 1281
num #instances #bytes class name
----------------------------------------------
1311: 1 32 com.explore.facade.FacadeApp$$EnhancerBySpringCGLIB$$313d9e3

四、可視化工具

1、jconsole

Java內(nèi)置的JVM性能監(jiān)控工具,在熟悉上述的命令行工具之后,對于該可視化工具的使用不會(huì)太陌生,在命令中可以查看到的默認(rèn)參數(shù)或者應(yīng)用自定義配置,在該工具中也可以找到,并且以圖形化的方式呈現(xiàn);

$ jconsole  # 通過該命令會(huì)喚起jconsole界面

圖片

這里選擇線程一欄,可以直觀的看到線程數(shù)量的變化曲線,也可以在下方查看某個(gè)線程的具體信息,并且可以通過檢測死鎖功能,發(fā)現(xiàn)在服務(wù)中創(chuàng)建的test-thread-01和test-thread-02兩條線程;

圖片

2、visualvm

VisualVM作為解決JVM問題的常用工具,集成的功能豐富且強(qiáng)大,此處通過Idea插件的方式啟動(dòng)FacadeApp微服務(wù),在進(jìn)程主頁可以看到自定義的配置,線程一欄因?yàn)闄z測到死鎖直接給到異常提示;

圖片

在監(jiān)視一欄可以通過【堆dump】查看詳細(xì)的信息,可以查看類的實(shí)例數(shù)和大小,并且完成了結(jié)果排序和占用統(tǒng)計(jì);此處信息在定位和解決JVM問題時(shí)非常重要;

圖片

對于JVM的監(jiān)控工具來說,其能力與常用的命令行語法差異很小,并且這些命令在jdk中tools.jar包也可以找到其對應(yīng)的類,對于一些更高級的監(jiān)控平臺(tái)來說,例如Kuboard、Skywalking等,也對這些底層能力做了集成,其原理應(yīng)該也是大同小異。

五、參考源碼

編程文檔: https://gitee.com/cicadasmile/butte-java-note

應(yīng)用倉庫: https://gitee.com/cicadasmile/butte-flyer-parent

責(zé)任編輯:武曉燕 來源: 知了一笑
相關(guān)推薦

2013-11-15 09:43:15

JDK工具

2023-02-10 09:28:23

優(yōu)化工具

2009-06-25 14:46:50

JDKJREJVM

2010-09-25 14:58:12

JVMJDKJRE

2012-01-11 13:04:40

JavaJVM

2012-06-25 10:40:24

Oracleawr

2009-07-08 10:41:54

JDK JRE JVM

2021-07-08 06:47:19

JVM監(jiān)控工具

2022-12-30 16:06:23

JDKJREJVM

2023-10-09 08:44:51

JDK命令行工具

2010-09-26 14:32:34

JDKJREJVM

2022-06-27 08:24:34

JDKJavaJRE

2012-01-11 11:28:00

JavaJVM

2023-10-10 22:24:16

2009-07-08 09:47:47

安裝JDKJREJVM

2020-07-21 14:19:18

JVM編程語言

2010-09-27 14:50:22

JDKJREJVM

2017-10-17 14:02:30

jvm調(diào)優(yōu)工具

2020-07-17 08:36:16

JVM性能監(jiān)控

2010-09-27 11:32:41

JVMJREJDK
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號