jvm常見分析工具

## 常見jvm分析工具主要是為了查錯(cuò)和進(jìn)行調(diào)優(yōu)

## 一、CLI

1、jps(java process status)

? jsp:

? ? -p 只顯示pid 不顯示class 名稱奔害,jar文件名和傳遞給main方法的參數(shù)

? ? -m 只顯示輸出main方法的參數(shù) 在嵌入式j(luò)vm上可能是null

? ? -l 輸出應(yīng)用程序main class的完整package名或者應(yīng)用程序的jar文件完整路徑名

? ? -v 輸出傳遞給jvm的參數(shù)

? ? jps host 查看host的jps的情況 前提host提供jstatd服務(wù)

2、jstatd(了解·)

啟動jvm監(jiān)控服務(wù)他是一個(gè)基于rmi(遠(yuǎn)程接口調(diào)用)的應(yīng)用凳怨,向遠(yuǎn)程機(jī)器提供本機(jī)jvm應(yīng)用程序的信息,默認(rèn)端口1099 -p指定端口

實(shí)例:jstatd -J-Djava.security.policy=my.policy &

my.policy文件需要自己建立是鬼,內(nèi)如如下:

grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };

這是安全策略文件肤舞,因?yàn)閖dk對jvm做了jaas(Java驗(yàn)證和授權(quán)API)的安全檢測,所以我們必須設(shè)置一些策略均蜜,使得jstatd被允許作網(wǎng)絡(luò)操作;

3.jmap

觀察運(yùn)行中的jvm物理內(nèi)存的占用情況

jmap:

pid 進(jìn)程號

常用參數(shù)

-heap:打印jvm heap(堆)的情況(垃圾收集器類型)

-histo:打印jvm heap的直方圖 其輸出信息包括類名李剖,對象數(shù)量,對象占用大小

histo:live 同上但是只打印存活對象的情況

-permstat:打印permanent generation heap(方法區(qū))情況(在jdk1.8之后不存在方法區(qū))

-finalizerinfo:打印正等候回收的對象信息

```

[bigdata@bigdata01 jvm]$ jmap -heap 8580

Attaching to process ID 8580, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.112-b15

using thread-local object allocation.

Parallel GC with 4 thread(s)

-Xms:500m -Xmx:1000m? ? 500M <= 堆空間 <= 1000m

Heap Configuration:

? MinHeapFreeRatio? ? ? ? = 0 ---->堆最小的空閑比例囤耳,此時(shí)堆的空間大小是多少:也就是說堆空間被占滿杖爽,顯然就是1000m

? MaxHeapFreeRatio? ? ? ? = 100 ---->堆最大的空閑比例,此時(shí)堆的空間大小是多少? 也就是說堆空間使用最小內(nèi)存紫皇,顯然就是500m

? MaxHeapSize? ? ? ? ? ? ? = 1048576000 (1000.0MB) 堆的最大空間大小

? NewSize? ? ? ? ? ? ? ? ? = 21495808 (20.5MB) 新生代初始化空間大小

? MaxNewSize? ? ? ? ? ? ? = 349175808 (333.0MB) 新生代最大空間大小

? OldSize? ? ? ? ? ? ? ? ? = 43515904 (41.5MB) 老年代的初始化空間大小

? NewRatio? ? ? ? ? ? ? ? = 2 老年代和新生代的內(nèi)存空間比例=2:1,加入調(diào)整為3-->-XX:NewRatio=3

? SurvivorRatio? ? ? ? ? ? = 8 Eden區(qū)和survivor空間比例:8:1:1

? MetaspaceSize? ? ? ? ? ? = 21807104 (20.796875MB) jdk1.8之后叫做元數(shù)據(jù)區(qū)腋寨,就是jdk1.8以前的PermSize聪铺, 初始化空間大小

? CompressedClassSpaceSize = 1073741824 (1024.0MB) 壓縮的類的空間大小

? MaxMetaspaceSize? ? ? ? = 17592186044415 MB 對應(yīng)的最大空間大小

? G1HeapRegionSize? ? ? ? = 0 (0.0MB)

Heap Usage:

PS Young Generation 新生代

Eden Space:

? capacity = 73400320 (70.0MB) 容量

? used? ? = 11939112 (11.386024475097656MB) 已用大小

? free? ? = 61461208 (58.613975524902344MB) 空閑大小

? 16.26574925013951% used

From Space:

? capacity = 4194304 (4.0MB)

? used? ? = 131072 (0.125MB)

? free? ? = 4063232 (3.875MB)

? 3.125% used

To Space:

? capacity = 6815744 (6.5MB)

? used? ? = 0 (0.0MB)

? free? ? = 6815744 (6.5MB)

? 0.0% used

PS Old Generation 老年代

? capacity = 76546048 (73.0MB)

? used? ? = 51528752 (49.14164733886719MB)

? free? ? = 25017296 (23.858352661132812MB)

? 67.31732512173588% used

16790 interned Strings occupying 1695440 bytes.

```

用jmap 把進(jìn)程內(nèi)存使用情況dump(相當(dāng)于導(dǎo)入)到文件中,在用jhat分析查看萄窜,jmap進(jìn)行dump命令格式如下

jmap -dump:fromat=b,file=dempFileNmae pid

jmap -dump:fromat=b,file=4574.heap20151215 4574

Dumping heap to 4574.heap20151215 4574

Heap dump file created

dump出來的文件可以用MAT铃剔、VisualVM等工具查看撒桨,這里用jhat查看:

jhat -port 9998 /tmp/dump.dat

注意如果Dump文件太大,可能需要加上-J-Xmx512m這種參數(shù)指定最大堆內(nèi)存键兜,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat凤类。然后就可以在瀏覽器中輸入主機(jī)地址:9998查看了。

注意:-J-Xmx512m中間沒有空格普气。

4谜疤、jinfo(了解)

Configuration info

官方地址http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jinfo.html

jinfo [option] pid

pid 進(jìn)程號

參數(shù)如下:

no option:打印命令行參數(shù)和系統(tǒng)屬性

-flags 打印命令行參數(shù)

-sysprops 打印系統(tǒng)屬性

- h 幫助

-我們經(jīng)常通過-D來給jvm傳遞自定義的系統(tǒng)參數(shù)

后臺通過System.properties來獲取這個(gè)參數(shù),進(jìn)而進(jìn)行下一步的操作:

5现诀、jstack

jstack :stack trace

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html

jstack 能得到運(yùn)行java程序的java stack(java堆棧)和native stack(本地堆棧)的信息夷磕,可以輕松得知當(dāng)前線程的運(yùn)行情況

jstack[option] pid

參數(shù)如下

-l 長列表,打印關(guān)于鎖的附加信息仔沿,例如屬于java.util.concurrent的ownable synchronizers列表

-m 打印java和native c/c++框架的所有信息

tid指java Thread id坐桩。nid指native線程的id。prio是線程的優(yōu)先級[0x00007fd4f8684000]是線程棧起始地址

dump 文件里 值得關(guān)注線程有:

死鎖封锉,Deadlock(重點(diǎn)關(guān)注)

等待資源绵跷,Waiting on condition(重點(diǎn)關(guān)注)

等待獲取監(jiān)視器,Waiting on monitor entry(重點(diǎn)關(guān)注)

阻塞成福,Blocked(重點(diǎn)關(guān)注)

執(zhí)行中碾局,Runnable?

暫停,Suspended

對象等待中闷叉,Object.wait() 或 TIMED_WAITING

停止擦俐,Parked

6、jstat

jstatd:java virtual Machine statistics Monitoring Tool

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html

Usage:jstat -help|-options

jstat -<option> [-t] [-h<lines>] <pid> [<interva[s|ms]> [<count>]]

參數(shù)解釋:

Options -選項(xiàng)握侧,我們一般使用-gcutil? /-gc查看gc情況

pid -VM的進(jìn)程號蚯瞧,即當(dāng)前運(yùn)行的java進(jìn)程號

interval[s|ms] --間隔時(shí)間,單位為秒或者毫秒品擎,默認(rèn)為ms埋合。必須為正整型

count - 打印次數(shù) 如果缺省打印無數(shù)次

例如例如:jstat -gc 4645 500 10? 表示查看進(jìn)程號為4645的gc 每500ms打印一次? 共打印10次

jstat -gc 8580 100ms 10

參數(shù)說明

S0C --->survivor-0 capacity

S1C --->survivor-1 capacity

S0U --->survivor-0 used

S1U --->survivor-1 used

EC --->eden capacity

EU --->eden used

OC --->old generation capacity

OU --->old generation used

MC --->metaspace capacity/jdk1.8以前叫PC

MU --->metaspace used/jdk1.8以前叫PU

CCSC --->compressed class space capacity

CCSU --->compressed class space used

YGC --->截止到目前為止總共執(zhí)行了多少次ygc(minor gc)

YGCT --->截止到目前為止總共執(zhí)行ygc消耗的時(shí)間(單位秒)

FGC --->截止到目前為止總共執(zhí)行了多少次fullgc(minor gc)

FGCT --->截止到目前為止總共執(zhí)行fullgc消耗的時(shí)間(單位秒)

GCT? --->截止到目前為止所有g(shù)c消耗的時(shí)間(單位秒)

## 二、GUI

1萄传、jconsole 可視化的jvm監(jiān)控軟件

可以監(jiān)控本地或者遠(yuǎn)程進(jìn)程

主要包括:概括甚颂、內(nèi)存、線程秀菱、類振诬、Vm概要、Mbean選項(xiàng)卡

概括選項(xiàng)卡:呈現(xiàn)四副圖表:主要包括堆內(nèi)存使用量衍菱、類赶么、線程、cpu占有率

內(nèi)存選項(xiàng)卡:包括堆內(nèi)存脊串、非堆內(nèi)存辫呻、內(nèi)存池的使用量圖表和詳細(xì)信息清钥。、相當(dāng)于jstat命令

線程選項(xiàng)卡:顯示所有的線程的信息圖表放闺、相當(dāng)于jstack命令

類選項(xiàng)卡:加載類的信息

Vm概要:Vm的概要信息包括堆大小祟昭、垃圾收集信息、Vm參數(shù)等

Mbean選項(xiàng):managed beans 被管理的beans

2怖侦、jvisualvm篡悟,

多合一的故障處理工具

visual vm是迄今為止,jdk發(fā)布的功能最強(qiáng)大的運(yùn)行監(jiān)視和故障處理程序础钠∏×Γ可以查看本都和遠(yuǎn)程的狀態(tài)

優(yōu)點(diǎn):不需要被監(jiān)控的程序基于特殊的Agent運(yùn)型,因此他對應(yīng)用程序的實(shí)際影響很小旗吁,這樣他可以直接運(yùn)行在生產(chǎn)環(huán)境中踩萎,這是其他監(jiān)視工具比如:jprofile、yourkit無法與之相比的

visualvm.exe

主要特點(diǎn):

1很钓、插件安裝香府。

2、生成码倦、瀏覽堆轉(zhuǎn)儲快照和線程快照企孩。

3、抽樣器和profiler中分析程序性能袁稽。

4勿璃、BTrace插件動態(tài)日志跟蹤。

# 三推汽、 常見jvm調(diào)優(yōu)參數(shù)總結(jié)

Java1.7的jvm參數(shù)查看一下官方網(wǎng)站补疑。

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

Java1.8

http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html

Hotspotvm知識查看一下官方網(wǎng)站。

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136373.html

主要的參數(shù)是:堆的大小歹撒、棧的大小莲组、新生代和老年代的比值、新生代中eden和s0暖夭、s1的比值锹杈。

**-Xms:初始堆大小**,默認(rèn)是物理內(nèi)存的1/64迈着。默認(rèn)(MinHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存小于40%時(shí)竭望,JVM就會增大堆直到--Xmx的最大限制。例如:-Xms 20m裕菠。

**-Xmx:最大堆大小**咬清。默認(rèn)是物理內(nèi)存的1/4? 默認(rèn)(MaxHeapFreeRatio參數(shù)可以調(diào)整)空余堆內(nèi)存大于70%時(shí),JVM會減少堆直到 -Xms的最小限制。

-**XX:NewSize=n**:設(shè)置年輕代大蟹阏瘛(初始值)。

**-XX:MaxNewSize**:設(shè)置年輕代最大值萤彩。

**-XX:NewRatio=n:**設(shè)置年輕代和年老代的比值粪滤。

**-XX:SurvivorRatio=n**:年輕代中Eden區(qū)與兩個(gè)Survivor區(qū)的比值。

**-XX:PermSize**(1.8之后改為MetaspaceSize)? 設(shè)置持久代(perm gen)初始值雀扶,默認(rèn)是物理內(nèi)存的1/64杖小。

**-XX:MaxPermSize=n**:(1.8之后改為MaxMetaspaceSize)設(shè)置最大持久代大小。

**-Xss**:每個(gè)線程的堆棧大小愚墓。

面試的時(shí)候如何闡述jvm予权,gc

運(yùn)行時(shí)區(qū)域--->gc(堆)--->不被引用的對象(引用?)--->判斷對象是否被引用--->可達(dá)性分析(兩次標(biāo)記)---->gc使用方式(gc的算法)--->minor gc 或者major gc浪册。

常見的優(yōu)化參數(shù):

? -Xms

? -Xmx

? -XX:NewSize...

垃圾收集器

? CMS扫腺、Serial、ParNew

常見的分析工具

? jsp

? jmap

? jstack

? jconsole

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末村象,一起剝皮案震驚了整個(gè)濱河市笆环,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厚者,老刑警劉巖躁劣,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異库菲,居然都是意外死亡账忘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門熙宇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳖擒,“玉大人,你說我怎么就攤上這事奇颠“苋ィ” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵烈拒,是天一觀的道長圆裕。 經(jīng)常有香客問我,道長荆几,這世上最難降的妖魔是什么吓妆? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮吨铸,結(jié)果婚禮上行拢,老公的妹妹穿的比我還像新娘。我一直安慰自己诞吱,他們只是感情好舟奠,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布竭缝。 她就那樣靜靜地躺著,像睡著了一般沼瘫。 火紅的嫁衣襯著肌膚如雪抬纸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天耿戚,我揣著相機(jī)與錄音湿故,去河邊找鬼。 笑死膜蛔,一個(gè)胖子當(dāng)著我的面吹牛坛猪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播皂股,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼墅茉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屑墨?” 一聲冷哼從身側(cè)響起躁锁,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卵史,沒想到半個(gè)月后战转,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡以躯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年槐秧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忧设。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刁标,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出址晕,到底是詐尸還是另有隱情膀懈,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布谨垃,位于F島的核電站启搂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏刘陶。R本人自食惡果不足惜胳赌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匙隔。 院中可真熱鬧疑苫,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挺勿,卻和暖如春阔加,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背满钟。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胳喷,地道東北人湃番。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像吭露,于是被迫代替她去往敵國和親吠撮。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile閱讀 5,373評論 1 56
  • 堆內(nèi)存設(shè)置 原理 JVM堆內(nèi)存分為2塊:Permanent Space 和 Heap Space讲竿。 Permane...
    superxcp閱讀 2,007評論 0 0
  • 作者:一字馬胡 轉(zhuǎn)載標(biāo)志 【2017-11-12】 更新日志 日期更新內(nèi)容備注 2017-11-12新建文章初版 ...
    beneke閱讀 2,210評論 0 7
  • 1泥兰、jdk 自帶基礎(chǔ)工具 2、MAT 分析dump 3题禀、VM 實(shí)時(shí)監(jiān)控 4 鞋诗、遇到過OOM 內(nèi)存溢出有哪些 1、J...
    smallsun512閱讀 9,904評論 0 2
  • 介紹JVM中7個(gè)區(qū)域迈嘹,然后把每個(gè)區(qū)域可能造成內(nèi)存的溢出的情況說明 程序計(jì)數(shù)器:看做當(dāng)前線程所執(zhí)行的字節(jié)碼行號指示器...
    jemmm閱讀 2,232評論 0 9