jstack(查看線程)、jmap(查看內(nèi)存)和jstat(性能分析)命令

http://guafei.iteye.com/blog/1815222

周末看到一個(gè)用jstack查看死鎖的例子挎春。昨天晚上總結(jié)了一下jstack(查看線程)旗唁、jmap(查看內(nèi)存)和jstat(性能分析)命令。供大家參考?

1.Jstack?

1.1?? jstack能得到運(yùn)行java程序的java stack和native stack的信息宴倍≌胖ⅲ可以輕松得知當(dāng)前線程的運(yùn)行情況。如下圖所示?


注:這個(gè)和thread dump是同樣的結(jié)果鸵贬。但是thread dump是用kill -3 pid命令俗他,還是服務(wù)器上面少用kill為妙?

1.2?? 命名行格式?

jstack [ option ] pid?

jstack [ option ] executable core?

jstack [ option ] [server-id@]remote-hostname-or-IP?

最常用的還是jstack? pid?

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

死鎖阔逼,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?

?? 對(duì)象等待中周伦,Object.wait() 或 TIMED_WAITING?

?? 停止夕春,Parked?

下面有詳細(xì)的例子講這種分析,大家參考原著?

http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html?

1.4?? 在thread dump中专挪,有幾種線程的定義如下?

線程名稱 所屬 解釋說(shuō)明?

Attach ListenerJVMAttach Listener 線程是負(fù)責(zé)接收到外部的命令及志,而對(duì)該命令進(jìn)行執(zhí)行的并且吧結(jié)果返回給發(fā)送者。通常我們會(huì)用一些命令去要求jvm給我們一些反饋信息寨腔,如:java -version速侈、jmap、jstack等等迫卢。 如果該線程在jvm啟動(dòng)的時(shí)候沒有初始化倚搬,那么,則會(huì)在用戶第一次執(zhí)行jvm命令時(shí)乾蛤,得到啟動(dòng)每界。?

Signal DispatcherJVM前面我們提到第一個(gè)Attach Listener線程的職責(zé)是接收外部jvm命令捅僵,當(dāng)命令接收成功后,會(huì)交給signal dispather 線程去進(jìn)行分發(fā)到各個(gè)不同的模塊處理命令眨层,并且返回處理結(jié)果庙楚。 signal dispather線程也是在第一次接收外部jvm命令時(shí),進(jìn)行初始化工作趴樱。?

CompilerThread0JVM用來(lái)調(diào)用JITing馒闷,實(shí)時(shí)編譯裝卸class 。 通常叁征,jvm會(huì)啟動(dòng)多個(gè)線程來(lái)處理這部分工作纳账,線程名稱后面的數(shù)字也會(huì)累加,例如:CompilerThread1?

Concurrent Mark-Sweep GC ThreadJVM并發(fā)標(biāo)記清除垃圾回收器(就是通常所說(shuō)的CMS GC)線程捺疼, 該線程主要針對(duì)于老年代垃圾回收塞祈。ps:?jiǎn)⒂迷摾厥掌鳎枰趈vm啟動(dòng)參數(shù)中加上: -XX:+UseConcMarkSweepGC?

DestroyJavaVMJVM執(zhí)行main()的線程在main執(zhí)行完后調(diào)用JNI中的 jni_DestroyJavaVM() 方法喚起DestroyJavaVM 線程帅涂。?? JVM在 Jboss 服務(wù)器啟動(dòng)之后,就會(huì)喚起DestroyJavaVM線程尤蛮,處于等待狀態(tài)媳友,等待其它線程(java線程和native線程)退出時(shí)通知它卸載JVM。線程退出時(shí)产捞,都會(huì)判斷自己當(dāng)前是否是整個(gè)JVM中最后一個(gè)非deamon線程醇锚,如果是,則通知DestroyJavaVM 線程卸載JVM坯临。?

ps:?

擴(kuò)展一下:?

1.如果線程退出時(shí)判斷自己不為最后一個(gè)非deamon線程焊唬,那么調(diào)用thread->exit(false) ,并在其中拋出thread_end事件看靠,jvm不退出赶促。?

2.如果線程退出時(shí)判斷自己為最后一個(gè)非deamon線程,那么調(diào)用before_exit() 方法挟炬,拋出兩個(gè)事件:? 事件1:thread_end 線程結(jié)束事件鸥滨、事件2:VM的death事件。?

然后調(diào)用thread->exit(true) 方法谤祖,接下來(lái)把線程從active list卸下婿滓,刪除線程等等一系列工作執(zhí)行完成后,則通知正在等待的DestroyJavaVM 線程執(zhí)行卸載JVM操作粥喜。?

ContainerBackgroundProcessor 線程JBOSS它是一個(gè)守護(hù)線程, 在jboss服務(wù)器在啟動(dòng)的時(shí)候就初始化了,主要工作是定期去檢查有沒有Session過(guò)期.過(guò)期則清除.?

參考:http://liudeh-009.iteye.com/blog/1584876?

Dispatcher-Thread-3? 線程Log4j????? Log4j具有異步打印日志的功能凸主,需要異步打印日志的Appender都需要注冊(cè)到 AsyncAppender對(duì)象里面去,由AsyncAppender進(jìn)行監(jiān)聽额湘,決定何時(shí)觸發(fā)日志打印操作卿吐。 AsyncAppender如果監(jiān)聽到它管轄范圍內(nèi)的Appender有打印日志的操作旁舰,則給這個(gè)Appender生成一個(gè)相應(yīng)的event,并將該event保存在一個(gè)buffuer區(qū)域內(nèi)但两。? Dispatcher-Thread-3線程負(fù)責(zé)判斷這個(gè)event緩存區(qū)是否已經(jīng)滿了鬓梅,如果已經(jīng)滿了,則將緩存區(qū)內(nèi)的所有event分發(fā)到Appender容器里面去谨湘,那些注冊(cè)上來(lái)的Appender收到自己的event后绽快,則開始處理自己的日志打印工作。 Dispatcher-Thread-3線程是一個(gè)守護(hù)線程紧阔。?

Finalizer線程JVM這個(gè)線程也是在main線程之后創(chuàng)建的坊罢,其優(yōu)先級(jí)為10,主要用于在垃圾收集前擅耽,調(diào)用對(duì)象的finalize()方法活孩;關(guān)于Finalizer線程的幾點(diǎn):?

1) 只有當(dāng)開始一輪垃圾收集時(shí),才會(huì)開始調(diào)用finalize()方法乖仇;因此并不是所有對(duì)象的finalize()方法都會(huì)被執(zhí)行憾儒;?

2) 該線程也是daemon線程,因此如果虛擬機(jī)中沒有其他非daemon線程乃沙,不管該線程有沒有執(zhí)行完finalize()方法起趾,JVM也會(huì)退出;?

3) JVM在垃圾收集時(shí)會(huì)將失去引用的對(duì)象包裝成Finalizer對(duì)象(Reference的實(shí)現(xiàn))警儒,并放入ReferenceQueue训裆,由Finalizer線程來(lái)處理;最后將該Finalizer對(duì)象的引用置為null蜀铲,由垃圾收集器來(lái)回收边琉;?

4) JVM為什么要單獨(dú)用一個(gè)線程來(lái)執(zhí)行finalize()方法呢?如果JVM的垃圾收集線程自己來(lái)做记劝,很有可能由于在finalize()方法中誤操作導(dǎo)致GC線程停止或不可控变姨,這對(duì)GC線程來(lái)說(shuō)是一種災(zāi)難;?

Gang worker#0JVMJVM 用于做新生代垃圾回收(monir gc)的一個(gè)線程厌丑。#號(hào)后面是線程編號(hào)钳恕,例如:Gang worker#1?

GC DaemonJVMGC Daemon 線程是JVM為RMI提供遠(yuǎn)程分布式GC使用的,GC Daemon線程里面會(huì)主動(dòng)調(diào)用System.gc()方法蹄衷,對(duì)服務(wù)器進(jìn)行Full GC忧额。 其初衷是當(dāng) RMI 服務(wù)器返回一個(gè)對(duì)象到其客戶機(jī)(遠(yuǎn)程方法的調(diào)用方)時(shí),其跟蹤遠(yuǎn)程對(duì)象在客戶機(jī)中的使用愧口。當(dāng)再?zèng)]有更多的對(duì)客戶機(jī)上遠(yuǎn)程對(duì)象的引用時(shí)睦番,或者如果引用的“租借”過(guò)期并且沒有更新,服務(wù)器將垃圾回收遠(yuǎn)程對(duì)象。?

不過(guò)托嚣,我們現(xiàn)在jvm啟動(dòng)參數(shù)都加上了-XX:+DisableExplicitGC配置巩检,所以,這個(gè)線程只有打醬油的份了示启。?

IdleRemoverJBOSSJboss連接池有一個(gè)最小值兢哭, 該線程每過(guò)一段時(shí)間都會(huì)被Jboss喚起,用于檢查和銷毀連接池中空閑和無(wú)效的連接夫嗓,直到剩余的連接數(shù)小于等于它的最小值迟螺。?

Java2D DisposerJVM????????? 這個(gè)線程主要服務(wù)于awt的各個(gè)組件。 說(shuō)起該線程的主要工作職責(zé)前舍咖,需要先介紹一下Disposer類是干嘛的矩父。 Disposer提供一個(gè)addRecord方法。 如果你想在一個(gè)對(duì)象被銷毀前再做一些善后工作排霉,那么窍株,你可以調(diào)用Disposer#addRecord方法,將這個(gè)對(duì)象和一個(gè)自定義的DisposerRecord接口實(shí)現(xiàn)類攻柠,一起傳入進(jìn)去球订,進(jìn)行注冊(cè)。?

Disposer類會(huì)喚起“Java2D Disposer”線程瑰钮,該線程會(huì)掃描已注冊(cè)的這些對(duì)象是否要被回收了冒滩,如果是,則調(diào)用該對(duì)象對(duì)應(yīng)的DisposerRecord實(shí)現(xiàn)類里面的dispose方法飞涂。?

Disposer實(shí)際上不限于在awt應(yīng)用場(chǎng)景,只是awt里面的很多組件需要訪問(wèn)很多操作系統(tǒng)資源祈搜,所以较店,這些組件在被回收時(shí),需要先釋放這些資源容燕。?

InsttoolCacheScheduler_?

QuartzSchedulerThreadQuartz??????? InsttoolCacheScheduler_QuartzSchedulerThread是Quartz的主線程梁呈,它主要負(fù)責(zé)實(shí)時(shí)的獲取下一個(gè)時(shí)間點(diǎn)要觸發(fā)的觸發(fā)器,然后執(zhí)行觸發(fā)器相關(guān)聯(lián)的作業(yè) 蘸秘。?

原理大致如下:?

Spring和Quartz結(jié)合使用的場(chǎng)景下官卡,Spring IOC容器初始化時(shí)會(huì)創(chuàng)建并初始化Quartz線程池(TreadPool),并啟動(dòng)它醋虏。剛啟動(dòng)時(shí)線程池中每個(gè)線程都處于等待狀態(tài)寻咒,等待外界給他分配Runnable(持有作業(yè)對(duì)象的線程)孟辑。?

繼而接著初始化并啟動(dòng)Quartz的主線程(InsttoolCacheScheduler_QuartzSchedulerThread)匙姜,該線程自啟動(dòng)后就會(huì)處于等待狀態(tài)。等待外界給出工作信號(hào)之后胡控,該主線程的run方法才實(shí)質(zhì)上開始工作。run中會(huì)獲取JobStore中下一次要觸發(fā)的作業(yè)叫挟,拿到之后會(huì)一直等待到該作業(yè)的真正觸發(fā)時(shí)間艰匙,然后將該作業(yè)包裝成一個(gè)JobRunShell對(duì)象(該對(duì)象實(shí)現(xiàn)了Runnable接口,其實(shí)看是上面TreadPool中等待外界分配給他的Runnable)抹恳,然后將剛創(chuàng)建的JobRunShell交給線程池员凝,由線程池負(fù)責(zé)執(zhí)行作業(yè)。?

線程池收到Runnable后奋献,從線程池一個(gè)線程啟動(dòng)Runnable健霹,反射調(diào)用JobRunShell中的run方法,run方法執(zhí)行完成之后秽荞, TreadPool將該線程回收至空閑線程中骤公。?

InsttoolCacheScheduler_Worker-2QuartzInsttoolCacheScheduler_Worker-2線程就是ThreadPool線程的一個(gè)簡(jiǎn)單實(shí)現(xiàn),它主要負(fù)責(zé)分配線程資源去執(zhí)行?

InsttoolCacheScheduler_QuartzSchedulerThread線程交給它的調(diào)度任務(wù)(也就是JobRunShell)扬跋。?

JBossLifeThreadJboss??????? Jboss主線程啟動(dòng)成功阶捆,應(yīng)用程序部署完畢之后將JBossLifeThread線程實(shí)例化并且start,JBossLifeThread線程啟動(dòng)成功之后就處于等待狀態(tài)钦听,以保持Jboss Java進(jìn)程處于存活中洒试。? 所得比較通俗一點(diǎn),就是Jboss啟動(dòng)流程執(zhí)行完畢之后朴上,為什么沒有結(jié)束垒棋? 就是因?yàn)橛羞@個(gè)線程hold主了它。 牛b吧~~?

JBoss System Threads(1)-1Jboss? 該線程是一個(gè)socket服務(wù)痪宰,默認(rèn)端口號(hào)為: 1099叼架。 主要用于接收外部naming service(Jboss? JNDI)請(qǐng)求。?

JCA PoolFillerJboss??? 該線程主要為JBoss內(nèi)部提供連接池的托管衣撬。? 簡(jiǎn)單介紹一下工作原理 :?

Jboss內(nèi)部凡是有遠(yuǎn)程連接需求的類乖订,都需要實(shí)現(xiàn)ManagedConnectionFactory接口,例如需要做JDBC連接的?

XAManagedConnectionFactory對(duì)象具练,就實(shí)現(xiàn)了該接口乍构。然后將XAManagedConnectionFactory對(duì)象,還有其它信息一起包裝到InternalManagedConnectionPool對(duì)象里面扛点,接著將InternalManagedConnectionPool交給PoolFiller對(duì)象里面的列隊(duì)進(jìn)行管理哥遮。?? JCA PoolFiller線程會(huì)定期判斷列隊(duì)內(nèi)是否有需要?jiǎng)?chuàng)建和管理的InternalManagedConnectionPool對(duì)象,如果有的話陵究,則調(diào)用該對(duì)象的fillToMin方法眠饮, 觸發(fā)它去創(chuàng)建相應(yīng)的遠(yuǎn)程連接,并且將這個(gè)連接維護(hù)到它相應(yīng)的連接池里面去铜邮。?

JDWP Event Helper ThreadJVM?

JDWP是通訊交互協(xié)議君仆,它定義了調(diào)試器和被調(diào)試程序之間傳遞信息的格式。它詳細(xì)完整地定義了請(qǐng)求命令、回應(yīng)數(shù)據(jù)和錯(cuò)誤代碼返咱,保證了前端和后端的JVMTI和JDI的通信通暢钥庇。? 該線程主要負(fù)責(zé)將JDI事件映射成JVMTI信號(hào),以達(dá)到調(diào)試過(guò)程中操作JVM的目的咖摹。?

JDWP Transport Listener: dt_socketJVM該線程是一個(gè)Java Debugger的監(jiān)聽器線程评姨,負(fù)責(zé)受理客戶端的debug請(qǐng)求。 通常我們習(xí)慣將它的監(jiān)聽端口設(shè)置為8787萤晴。?

Low Memory DetectorJVM這個(gè)線程是負(fù)責(zé)對(duì)可使用內(nèi)存進(jìn)行檢測(cè)吐句,如果發(fā)現(xiàn)可用內(nèi)存低,分配新的內(nèi)存空間店读。?

process reaperJVM??? 該線程負(fù)責(zé)去執(zhí)行一個(gè) OS 命令行的操作嗦枢。?

Reference HandlerJVM??????? JVM在創(chuàng)建main線程后就創(chuàng)建Reference Handler線程,其優(yōu)先級(jí)最高屯断,為10文虏,它主要用于處理引用對(duì)象本身(軟引用、弱引用殖演、虛引用)的垃圾回收問(wèn)題 氧秘。?

Surrogate Locker Thread (CMS)JVM????????? 這個(gè)線程主要用于配合CMS垃圾回收器使用,它是一個(gè)守護(hù)線程趴久,其主要負(fù)責(zé)處理GC過(guò)程中丸相,Java層的Reference(指軟引用、弱引用等等)與jvm 內(nèi)部層面的對(duì)象狀態(tài)同步彼棍。 這里對(duì)它們的實(shí)現(xiàn)稍微做一下介紹:這里拿 WeakHashMap做例子灭忠,將一些關(guān)鍵點(diǎn)先列出來(lái)(我們后面會(huì)將這些關(guān)鍵點(diǎn)全部串起來(lái)):?

1.? 我們知道HashMap用Entry[]數(shù)組來(lái)存儲(chǔ)數(shù)據(jù)的,WeakHashMap也不例外, 內(nèi)部有一個(gè)Entry[]數(shù)組座硕。?

2.?? WeakHashMap的Entry比較特殊弛作,它的繼承體系結(jié)構(gòu)為Entry->WeakReference->Reference 。?

3.? Reference 里面有一個(gè)全局鎖對(duì)象:Lock坎吻,它也被稱為pending_lock.??? 注意:它是靜態(tài)對(duì)象缆蝉。?

4.?????? Reference? 里面有一個(gè)靜態(tài)變量:pending宇葱。?

5.? Reference? 里面有一個(gè)靜態(tài)內(nèi)部類:ReferenceHandler的線程瘦真,它在static塊里面被初始化并且啟動(dòng),啟動(dòng)完成后處于wait狀態(tài)黍瞧,它在一個(gè)Lock同步鎖模塊中等待诸尽。?

6.? 另外,WeakHashMap里面還實(shí)例化了一個(gè)ReferenceQueue列隊(duì)印颤,這個(gè)列隊(duì)的作用您机,后面會(huì)提到。?

7.? 上面關(guān)鍵點(diǎn)就介紹完畢了,下面我們把他們串起來(lái)际看。?

假設(shè)咸产,WeakHashMap對(duì)象里面已經(jīng)保存了很多對(duì)象的引用。 JVM 在進(jìn)行CMS GC的時(shí)候仲闽,會(huì)創(chuàng)建一個(gè)ConcurrentMarkSweepThread(簡(jiǎn)稱CMST)線程去進(jìn)行GC脑溢,ConcurrentMarkSweepThread線程被創(chuàng)建的同時(shí)會(huì)創(chuàng)建一個(gè)SurrogateLockerThread(簡(jiǎn)稱SLT)線程并且啟動(dòng)它,SLT啟動(dòng)之后赖欣,處于等待階段屑彻。CMST開始GC時(shí),會(huì)發(fā)一個(gè)消息給SLT讓它去獲取Java層Reference對(duì)象的全局鎖:Lock顶吮。 直到CMS GC完畢之后社牲,JVM 會(huì)將WeakHashMap中所有被回收的對(duì)象所屬的WeakReference容器對(duì)象放入到Reference 的pending屬性當(dāng)中(每次GC完畢之后,pending屬性基本上都不會(huì)為null了)悴了,然后通知SLT釋放并且notify全局鎖:Lock搏恤。此時(shí)激活了ReferenceHandler線程的run方法,使其脫離wait狀態(tài)让禀,開始工作了挑社。ReferenceHandler這個(gè)線程會(huì)將pending中的所有WeakReference對(duì)象都移動(dòng)到它們各自的列隊(duì)當(dāng)中,比如當(dāng)前這個(gè)WeakReference屬于某個(gè)WeakHashMap對(duì)象巡揍,那么它就會(huì)被放入相應(yīng)的ReferenceQueue列隊(duì)里面(該列隊(duì)是鏈表結(jié)構(gòu))痛阻。 當(dāng)我們下次從WeakHashMap對(duì)象里面get、put數(shù)據(jù)或者調(diào)用size方法的時(shí)候腮敌,WeakHashMap就會(huì)將ReferenceQueue列隊(duì)中的WeakReference依依poll出來(lái)去和Entry[]數(shù)據(jù)做比較阱当,如果發(fā)現(xiàn)相同的,則說(shuō)明這個(gè)Entry所保存的對(duì)象已經(jīng)被GC掉了糜工,那么將Entry[]內(nèi)的Entry對(duì)象剔除掉弊添。?

taskObjectTimerFactoryJVM????????? 顧名思義,該線程就是用來(lái)執(zhí)行任務(wù)的捌木。 當(dāng)我們把一個(gè)認(rèn)為交給Timer對(duì)象油坝,并且告訴它執(zhí)行時(shí)間,周期時(shí)間后刨裆,Timer就會(huì)將該任務(wù)放入任務(wù)列隊(duì)澈圈,并且通知taskObjectTimerFactory線程去處理任務(wù),taskObjectTimerFactory線程會(huì)將狀態(tài)為取消的任務(wù)從任務(wù)列隊(duì)中移除帆啃,如果任務(wù)是非重復(fù)執(zhí)行類型的瞬女,則在執(zhí)行完該任務(wù)后,將它從任務(wù)列隊(duì)中移除努潘,如果該任務(wù)是需要重復(fù)執(zhí)行的诽偷,則計(jì)算出它下一次執(zhí)行的時(shí)間點(diǎn)坤学。?

VM Periodic Task ThreadJVM??????? 該線程是JVM周期性任務(wù)調(diào)度的線程,它由WatcherThread創(chuàng)建报慕,是一個(gè)單例對(duì)象深浮。 該線程在JVM內(nèi)使用得比較頻繁,比如:定期的內(nèi)存監(jiān)控眠冈、JVM運(yùn)行狀況監(jiān)控略号,還有我們經(jīng)常需要去執(zhí)行一些jstat 這類命令查看gc的情況,如下:?

jstat -gcutil 23483 250 7?? 這個(gè)命令告訴jvm在控制臺(tái)打印PID為:23483的gc情況洋闽,間隔250毫秒打印一次玄柠,一共打印7次。?

VM ThreadJVM???????? 這個(gè)線程就比較牛b了诫舅,是jvm里面的線程母體羽利,根據(jù)hotspot源碼(vmThread.hpp)里面的注釋,它是一個(gè)單例的對(duì)象(最原始的線程)會(huì)產(chǎn)生或觸發(fā)所有其他的線程刊懈,這個(gè)單個(gè)的VM線程是會(huì)被其他線程所使用來(lái)做一些VM操作(如这弧,清掃垃圾等)。?

在 VMThread 的結(jié)構(gòu)體里有一個(gè)VMOperationQueue列隊(duì)虚汛,所有的VM線程操作(vm_operation)都會(huì)被保存到這個(gè)列隊(duì)當(dāng)中匾浪,VMThread 本身就是一個(gè)線程,它的線程負(fù)責(zé)執(zhí)行一個(gè)自輪詢的loop函數(shù)(具體可以參考:VMThread.cpp里面的void VMThread::loop()) 卷哩,該loop函數(shù)從VMOperationQueue列隊(duì)中按照優(yōu)先級(jí)取出當(dāng)前需要執(zhí)行的操作對(duì)象(VM_Operation)蛋辈,并且調(diào)用VM_Operation->evaluate函數(shù)去執(zhí)行該操作類型本身的業(yè)務(wù)邏輯。?

ps:VM操作類型被定義在vm_operations.hpp文件內(nèi)将谊,列舉幾個(gè):ThreadStop冷溶、ThreadDump、PrintThreads尊浓、GenCollectFull逞频、GenCollectFullConcurrent、CMS_Initial_Mark栋齿、CMS_Final_Remark….. 有興趣的同學(xué)苗胀,可以自己去查看源文件。?

(搬運(yùn)自 http://blog.csdn.net/a43350860/article/details/8134234 感謝原著作者)?

2.Jmap?

2.1?? 得到運(yùn)行java程序的內(nèi)存分配的詳細(xì)情況瓦堵。例如實(shí)例個(gè)數(shù)基协,大小等?

2.2?? 命名行格式?

jmap [ option ] pid?

jmap [ option ] executable core?

jmap [ option ] [server-id@]remote-hostname-or-IP?

-dump:[live,]format=b,file= 使用hprof二進(jìn)制形式,輸出jvm的heap內(nèi)容到文件=. live子選項(xiàng)是可選的,假如指定live選項(xiàng),那么只輸出活的對(duì)象到文件.?

-finalizerinfo 打印正等候回收的對(duì)象的信息.?

-heap 打印heap的概要信息谷丸,GC使用的算法堡掏,heap的配置及wise heap的使用情況.?

-histo[:live] 打印每個(gè)class的實(shí)例數(shù)目,內(nèi)存占用,類全名信息. VM的內(nèi)部類名字開頭會(huì)加上前綴”*”. 如果live子參數(shù)加上后,只統(tǒng)計(jì)活的對(duì)象數(shù)量.?

-permstat 打印classload和jvm heap長(zhǎng)久層的信息. 包含每個(gè)classloader的名字,活潑性,地址,父classloader和加載的class數(shù)量. 另外,內(nèi)部String的數(shù)量和占用內(nèi)存數(shù)也會(huì)打印出來(lái).?

-F 強(qiáng)迫.在pid沒有相應(yīng)的時(shí)候使用-dump或者-histo參數(shù). 在這個(gè)模式下,live子參數(shù)無(wú)效.?

-h | -help 打印輔助信息?

-J 傳遞參數(shù)給jmap啟動(dòng)的jvm.?

2.3?? 使用例子?

jmap -histo pid(查看實(shí)例)?


jmap -dump:format=b,file=heap.bin pid(導(dǎo)出內(nèi)存应结,據(jù)說(shuō)對(duì)性能有影響刨疼,小心使用)?

(format=b是通過(guò)二進(jìn)制的意思泉唁,但是能不能導(dǎo)出文本文件我沒找到,知道的告訴我)?

把內(nèi)存結(jié)構(gòu)全部dump到二進(jìn)制文件中揩慕,通過(guò)IBM的HeapAnalyzer和eclipse的MemoryAnalyzer都可以分析內(nèi)存結(jié)構(gòu)亭畜。?

這個(gè)是我用HeapAnalyzer查看出的我們daily的內(nèi)存結(jié)構(gòu),已經(jīng)列出了可能存在的問(wèn)題迎卤。(這個(gè)工具我不熟悉拴鸵,只供大家參考)?


下面是我用eclipse 的MemoryAnalyzer查看內(nèi)存結(jié)構(gòu)圖?




上面的是eclipse分析內(nèi)存泄漏分析出的。這個(gè)功能點(diǎn)非常多蜗搔【⒚辏可以慢慢學(xué)習(xí)?

3.Jstat?

3.1?? 這是一個(gè)比較實(shí)用的一個(gè)命令,可以觀察到classloader樟凄,compiler聘芜,gc相關(guān)信息》炝洌可以時(shí)時(shí)監(jiān)控資源和性能?

3.2????? 命令格式?

-class:統(tǒng)計(jì)class loader行為信息?

-compile:統(tǒng)計(jì)編譯行為信息?

-gc:統(tǒng)計(jì)jdk gc時(shí)heap信息?

-gccapacity:統(tǒng)計(jì)不同的generations(不知道怎么翻譯好汰现,包括新生區(qū),老年區(qū)叔壤,permanent區(qū))相應(yīng)的heap容量情況?

-gccause:統(tǒng)計(jì)gc的情況瞎饲,(同-gcutil)和引起gc的事件?

-gcnew:統(tǒng)計(jì)gc時(shí),新生代的情況?

-gcnewcapacity:統(tǒng)計(jì)gc時(shí)炼绘,新生代heap容量?

-gcold:統(tǒng)計(jì)gc時(shí)嗅战,老年區(qū)的情況?

-gcoldcapacity:統(tǒng)計(jì)gc時(shí),老年區(qū)heap容量?

-gcpermcapacity:統(tǒng)計(jì)gc時(shí)俺亮,permanent區(qū)heap容量?

-gcutil:統(tǒng)計(jì)gc時(shí)仗哨,heap情況?

3.3?? 輸出參數(shù)內(nèi)容?

S0? — Heap上的 Survivor space 0 區(qū)已使用空間的百分比?

S0C:S0當(dāng)前容量的大小?

S0U:S0已經(jīng)使用的大小?

S1? — Heap上的 Survivor space 1 區(qū)已使用空間的百分比?

S1C:S1當(dāng)前容量的大小?

S1U:S1已經(jīng)使用的大小?

E?? — Heap上的 Eden space 區(qū)已使用空間的百分比?

EC:Eden space當(dāng)前容量的大小?

EU:Eden space已經(jīng)使用的大小?

O?? — Heap上的 Old space 區(qū)已使用空間的百分比?

OC:Old space當(dāng)前容量的大小?

OU:Old space已經(jīng)使用的大小?

P?? — Perm space 區(qū)已使用空間的百分比?

OC:Perm space當(dāng)前容量的大小?

OU:Perm space已經(jīng)使用的大小?

YGC — 從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生 Young GC 的次數(shù)?

YGCT– 從應(yīng)用程序啟動(dòng)到采樣時(shí) Young GC 所用的時(shí)間(單位秒)?

FGC — 從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生 Full GC 的次數(shù)?

FGCT– 從應(yīng)用程序啟動(dòng)到采樣時(shí) Full GC 所用的時(shí)間(單位秒)?

GCT — 從應(yīng)用程序啟動(dòng)到采樣時(shí)用于垃圾回收的總時(shí)間(單位秒),它的值等于YGC+FGC?

例子1?


例子2(連續(xù)5次)?


例子3(PGCMN顯示的是最小perm的內(nèi)存使用量铅辞,PGCMX顯示的是perm的內(nèi)存最大使用量厌漂,PGC是當(dāng)前新生成的perm內(nèi)存占用量,PC是但前perm內(nèi)存占用量)?


這個(gè)工具的參數(shù)非常多斟珊,據(jù)說(shuō)基本能覆蓋jprofile等收費(fèi)工具的所有功能了苇倡。多用用對(duì)于系統(tǒng)調(diào)優(yōu)還是很有幫助的?

注1:我們?cè)赿aily用這樣命令時(shí),都要用-F參數(shù)的囤踩。因?yàn)槲覀兊挠脩舳疾皇菃?dòng)命令的用戶?

注2:daily的這些命令好像都沒有配置到環(huán)境變量里面旨椒,這個(gè)是我在自己應(yīng)用機(jī)器里面看到的。需要去jdk目錄底下執(zhí)行堵漱。Sudo當(dāng)然是必須的了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末综慎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子勤庐,更是在濱河造成了極大的恐慌示惊,老刑警劉巖好港,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異米罚,居然都是意外死亡钧汹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門录择,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拔莱,“玉大人,你說(shuō)我怎么就攤上這事隘竭√燎兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵动看,是天一觀的道長(zhǎng)嗤形。 經(jīng)常有香客問(wèn)我,道長(zhǎng)弧圆,這世上最難降的妖魔是什么赋兵? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮搔预,結(jié)果婚禮上霹期,老公的妹妹穿的比我還像新娘。我一直安慰自己拯田,他們只是感情好历造,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著船庇,像睡著了一般吭产。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸭轮,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天臣淤,我揣著相機(jī)與錄音,去河邊找鬼窃爷。 笑死邑蒋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的按厘。 我是一名探鬼主播医吊,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逮京!你這毒婦竟也來(lái)了卿堂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懒棉,失蹤者是張志新(化名)和其女友劉穎草描,沒想到半個(gè)月后览绿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陶珠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了享钞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揍诽。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栗竖,靈堂內(nèi)的尸體忽然破棺而出暑脆,到底是詐尸還是另有隱情,我是刑警寧澤狐肢,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布添吗,位于F島的核電站,受9級(jí)特大地震影響份名,放射性物質(zhì)發(fā)生泄漏碟联。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一僵腺、第九天 我趴在偏房一處隱蔽的房頂上張望鲤孵。 院中可真熱鬧,春花似錦辰如、人聲如沸普监。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凯正。三九已至,卻和暖如春豌蟋,著一層夾襖步出監(jiān)牢的瞬間廊散,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工梧疲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奸汇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓往声,卻偏偏與公主長(zhǎng)得像擂找,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浩销,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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