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

java -XX:+PrintFlagsInitial :查看所有JVM參數(shù)啟動(dòng)的初始值

java -XX:+PrintFlagsFinal :查看所有JVM參數(shù)的最終值

java -參數(shù)名稱:+PrintCommandLineFlags :查看那些已經(jīng)被用戶或者JVM設(shè)置過的詳細(xì)的XX參數(shù)的名稱和值



jps:java process Status?


1)jps:查看當(dāng)前運(yùn)行中java的線程

2)jps -q :僅顯示進(jìn)程ID

3)jps -l :輸出進(jìn)程ID和程序的全類名,如果是jar包輸出jar完整路徑

4)jps -m:輸出進(jìn)程啟動(dòng)時(shí)傳遞給main()的參數(shù)

5)jps -v:列出進(jìn)程啟動(dòng)時(shí)的JVM參數(shù)吕晌,比如 -Xms20m

如果某java進(jìn)程關(guān)閉了默認(rèn)開啟的UsePerfData參數(shù)(-XX:-UsePerfData)番官,那jps將無法知道該進(jìn)程




jstat:JVM Statistics Monitoring Tool?



查看JVM統(tǒng)計(jì)信息,類裝載、內(nèi)存虹菲、垃圾收集憋肖、JIT編譯等運(yùn)行數(shù)據(jù)。

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

interval?單位是毫秒胰苏,每過多久打印一次

count?打印多少次硕蛹,默認(rèn)一個(gè)參數(shù)是interval

-t?程序從開始執(zhí)行到現(xiàn)在過了多少時(shí)間 ms

-h?每個(gè)多少多少條打印一次表頭

-class舉例:jstat -class -t -h3 13152 1000 10

其中h3中的3代表每隔3個(gè)分隔一次,13152代表類的進(jìn)程id,1000代表每隔1000毫秒打印一次法焰,10代表一共打印10次秧荆,如下所示:其中Timestamp代表程序至今的運(yùn)行時(shí)間,單位為秒埃仪;Loaded代表加載的類的數(shù)目乙濒;Bytes代表加載的類的總字節(jié)數(shù);Unloaded代表卸載的類的數(shù)目卵蛉;Bytes代表卸載的類的總字節(jié)數(shù)颁股;Time代表類裝載所消耗的時(shí)間;

<option>

常用的option

1)-gc :查看jvm在GC時(shí)的信息傻丝,顯示指定線程的內(nèi)存使用情況

S0C代表幸存者0區(qū)的總?cè)萘扛视校琒1C代表幸存者1區(qū)的總?cè)萘浚琒0U代表幸存者0區(qū)使用的容量葡缰,S1U代表幸存者1區(qū)使用的容量亏掀,EC代表伊甸園區(qū)的總?cè)萘浚珽U代表伊甸園區(qū)使用的總?cè)萘糠菏停琌C代表老年代的總?cè)萘炕系琌U代表老年代已經(jīng)使用的容量

MC代表方法區(qū)的總?cè)萘浚琈U代表方法區(qū)的總?cè)萘啃舶模珻CSC代表壓縮類的總?cè)萘扛没ィ珻CSU代表壓縮類使用的容量

YGC代表年輕代垃圾回收的次數(shù),YGCT年輕代進(jìn)行垃圾回收需要的時(shí)間韭畸,F(xiàn)GC代表代表Full GC的次數(shù)宇智,F(xiàn)GCT代表Full GC的時(shí)間,GCT代表從應(yīng)用程序啟動(dòng)到采樣時(shí)gc的總時(shí)間


常用的使用方式

1. 計(jì)算垃圾回收占運(yùn)行時(shí)間的比例

我們執(zhí)行jstat -gc -t 13152 1000 10胰丁,這代表1秒打印出1行随橘,一共10行,-t代表打印出Timestamp總運(yùn)行時(shí)間

通過Timestamp得到程序運(yùn)行時(shí)間差锦庸,通過GCT得到垃圾回收時(shí)間差机蔗,單位都是秒,相除即為GC時(shí)間占運(yùn)行時(shí)間的比例甘萧。如果高于20%說明堆壓力較大萝嘁,超過90%說明當(dāng)前堆隨時(shí)有可能溢出報(bào)OOM。在項(xiàng)目部署之后就需要使用命令行去看了扬卷,就沒有可視化界面了牙言,所以這種方式也要會(huì)。

2. 判斷有可能存在的內(nèi)存泄漏問題

通過在每一段固定的時(shí)間內(nèi)抽取最小值的OU(老年代使用的空間)怪得,如果這個(gè)值一直呈上升趨勢(shì)的話咱枉,意味著無法回收的對(duì)象在不斷增加卑硫,可能存在內(nèi)存泄漏。



jinfo:Configuration Info for Java


實(shí)時(shí)查看和修改JVM配置參數(shù)?:jinfo <option> <pid>

常用的option

1)jinfo -flag 屬性 進(jìn)程id:查看某個(gè)參數(shù)情況


jmap:JVM Memory Map


導(dǎo)出內(nèi)存映像dump文件 & 獲取內(nèi)存使用情況

jmap [option] <pid>

jmap [option] <executable <core>>

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


常用命令


1.??導(dǎo)出內(nèi)存映像文件

jmap -dump:live,format=b,file=usr/desktop/test.hprof 1130

1. 一般使用的是第二種方式蚕断,也就是生成堆中存活對(duì)象的快照欢伏,畢竟這種方式生成的dump文件更小,我們傳輸處理都更方便亿乳。

2. file=后面的是生成的dump文件地址颜懊,filename是文件路徑+文件名稱,后綴名必須是.hprof风皿。format=b表示生成的是標(biāo)準(zhǔn)的dump文件河爹,用來進(jìn)行格式限定。

3. 自動(dòng)方式在生成的dump文件之前通常會(huì)觸發(fā)一次Full GC桐款,所以里面都是Full GC后留下的對(duì)象信息咸这。如果希望在程序發(fā)生OOM退出系統(tǒng)的時(shí)候能自動(dòng)導(dǎo)出dump文件,那么就需要使用自動(dòng)方式魔眨。


2.??顯示堆內(nèi)存的相關(guān)信息

2.1)jmap -heap pid (jdk8之后失效)

jdk8之后使用:jhsdb jmap --heap --pid pid

導(dǎo)出這一刻堆空間的使用情況媳维,使用jstat和visualVM更好。

2.2)jmap -histo pid

查看這一時(shí)刻內(nèi)存對(duì)象實(shí)例數(shù)量遏暴,包括它所在的class name侄刽、所占容量、按照所占容量大小進(jìn)行排序朋凉。

注意

由于jmap將訪問堆中的所有對(duì)象州丹,為了保證在此過程中不被應(yīng)用線程干擾,jmap需要借助安全點(diǎn)機(jī)制杂彭,讓所有線程停留在不改變堆中數(shù)據(jù)的狀態(tài)墓毒,也就是說,由jmap導(dǎo)出的堆快照必定是安全點(diǎn)位置的亲怠,這可能導(dǎo)致基于該堆快照的分析結(jié)果存在偏差所计。也就是說,假設(shè)在編譯生成的機(jī)器碼中团秽,某些對(duì)象的生命周期在兩個(gè)安全點(diǎn)之間主胧,那么:live選項(xiàng)將無法探知到這些對(duì)象。另外习勤,如果某個(gè)線程長(zhǎng)時(shí)間無法跑到安全點(diǎn)踪栋,jmap將一直等下去,與前面講的jstat則不同姻报,垃圾回收器會(huì)主動(dòng)將jstat所需要的摘要數(shù)據(jù)保存至固定位置之中己英,而jstat只需直接讀取即可间螟。


jhat:JVM Heap Analysis Tool


JDK自帶堆分析工具吴旋,與jmap命令搭配使用损肛,用于分析jmap生成的heap dump文件,jhat內(nèi)置了一個(gè)微型的HTTP/HTML服務(wù)器(端口是7000)荣瑟,生成dump文件的分析結(jié)果后治拿,用戶可以在瀏覽器中查看分析結(jié)果(可以通過OQL語(yǔ)句進(jìn)行過濾查詢)。

jhat命令在jdk9及其之后就被移除了笆焰,官方建議使用jvisualvm代替jhat劫谅,所以該指令只需簡(jiǎn)單了解一下即可。

jhat [option] [dumpfile]嚷掠,其中dumpfile代表dump文件的地址以及名稱


jstak:JVM Stack Trace


打印JVM中線程快照(JVM內(nèi)指定進(jìn)程的每一條線程正在執(zhí)行的方法堆棧的集合)捏检。可用于定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因不皆,如線程間的死鎖贯城、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等問題霹娄,這些都是導(dǎo)致線程長(zhǎng)時(shí)間停頓的常見原因能犯,當(dāng)線程出現(xiàn)長(zhǎng)時(shí)間停頓的時(shí)候,就可以使用jstack顯示各個(gè)線程調(diào)用的堆棧情況犬耻。也可以通過java層面:Thread.getAllStackTrances() 得到一個(gè)Map<Thread, StackTranceElement[] >來實(shí)現(xiàn)踩晶。

jstack [option] pid

在thread dump中,要留意下面幾種狀態(tài):

1)死鎖 Deadlock????

2)等待資源 Waiting on condition? ??

3)等待獲取監(jiān)視器 Waiting on monitor entry

4)阻塞 Blocked

5)執(zhí)行中 Runnable

6)暫停 Suspended

7)對(duì)象等待中枕磁,Object.wait() 或 TIMED_WAITING

8)停止 Parked

顯示進(jìn)程下面所有的線程狀態(tài)


jcmd


jdk1.7后新增渡蜻,可以用來實(shí)現(xiàn)除了jstat之外所有命令。

首先通過 jcmd 進(jìn)程號(hào) help 得出命令列表:根據(jù)以下命令來替換之前的那些操作:

Thread.print 可以替換 jstack指令

GC.class_histogram 可以替換 jmap中的-histo操作

GC.heap_dump 可以替換 jmap中的-dump操作

GC.run 可以查看GC的執(zhí)行情況

VM.uptime 可以查看程序的總執(zhí)行時(shí)間计济,可以替換jstat指令中的-t操作

VM.system_properties 可以替換 jinfo -sysprops 進(jìn)程id

VM.flags 可以獲取JVM的配置參數(shù)信息?


jstatd:遠(yuǎn)程主機(jī)信息收集



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晴楔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子峭咒,更是在濱河造成了極大的恐慌税弃,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凑队,死亡現(xiàn)場(chǎng)離奇詭異则果,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)漩氨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門西壮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叫惊,你說我怎么就攤上這事款青。” “怎么了霍狰?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵抡草,是天一觀的道長(zhǎng)饰及。 經(jīng)常有香客問我,道長(zhǎng)康震,這世上最難降的妖魔是什么燎含? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮腿短,結(jié)果婚禮上屏箍,老公的妹妹穿的比我還像新娘。我一直安慰自己橘忱,他們只是感情好赴魁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钝诚,像睡著了一般尚粘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敲长,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天郎嫁,我揣著相機(jī)與錄音,去河邊找鬼祈噪。 笑死泽铛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辑鲤。 我是一名探鬼主播盔腔,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼月褥!你這毒婦竟也來了弛随?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宁赤,失蹤者是張志新(化名)和其女友劉穎舀透,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體决左,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡愕够,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佛猛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惑芭。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖继找,靈堂內(nèi)的尸體忽然破棺而出遂跟,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布幻锁,位于F島的核電站凯亮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏越败。R本人自食惡果不足惜触幼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一硼瓣、第九天 我趴在偏房一處隱蔽的房頂上張望究飞。 院中可真熱鬧,春花似錦堂鲤、人聲如沸亿傅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葵擎。三九已至,卻和暖如春半哟,著一層夾襖步出監(jiān)牢的瞬間酬滤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工寓涨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盯串,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓戒良,卻偏偏與公主長(zhǎng)得像体捏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子糯崎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355