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

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

公司內(nèi)部同事分享的一篇文章

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

1.Jstack

1.1?? jstack能得到運行java程序的java stack和native stack的信息端幼【剩可以輕松得知當(dāng)前線程的運行情況。如下圖所示

注:這個和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(重點關(guān)注)

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

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

阻塞郊供,Blocked(重點關(guān)注)

?? 執(zhí)行中,Runnable

?? 暫停近哟,Suspended

?? 對象等待中驮审,Object.wait() 或 TIMED_WAITING

?? 停止,Parked

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

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

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

線程名稱 所屬 解釋說明

Attach Listener JVM Attach Listener 線程是負(fù)責(zé)接收到外部的命令,而對該命令進行執(zhí)行的并且吧結(jié)果返回給發(fā)送者戳玫。通常我們會用一些命令去要求jvm給我們一些反饋信息熙掺,如:java -version判族、jmap雀瓢、jstack等等寓盗。 如果該線程在jvm啟動的時候沒有初始化,那么各薇,則會在用戶第一次執(zhí)行jvm命令時,得到啟動踊兜。

Signal Dispatcher JVM 前面我們提到第一個Attach Listener線程的職責(zé)是接收外部jvm命令犹赖,當(dāng)命令接收成功后,會交給signal dispather 線程去進行分發(fā)到各個不同的模塊處理命令董瞻,并且返回處理結(jié)果寞蚌。 signal dispather線程也是在第一次接收外部jvm命令時,進行初始化工作力细。

CompilerThread0 JVM 用來調(diào)用JITing睬澡,實時編譯裝卸class 。 通常眠蚂,jvm會啟動多個線程來處理這部分工作煞聪,線程名稱后面的數(shù)字也會累加,例如:CompilerThread1

Concurrent Mark-Sweep GC Thread JVM 并發(fā)標(biāo)記清除垃圾回收器(就是通常所說的CMS GC)線程逝慧, 該線程主要針對于老年代垃圾回收昔脯。ps:啟用該垃圾回收器,需要在jvm啟動參數(shù)中加上: -XX:+UseConcMarkSweepGC

DestroyJavaVM JVM 執(zhí)行main()的線程在main執(zhí)行完后調(diào)用JNI中的 jni_DestroyJavaVM() 方法喚起DestroyJavaVM 線程笛臣。?? JVM在 Jboss 服務(wù)器啟動之后云稚,就會喚起DestroyJavaVM線程,處于等待狀態(tài)沈堡,等待其它線程(java線程和native線程)退出時通知它卸載JVM静陈。線程退出時,都會判斷自己當(dāng)前是否是整個JVM中最后一個非deamon線程诞丽,如果是鲸拥,則通知DestroyJavaVM 線程卸載JVM。

ps:

擴展一下:

1.如果線程退出時判斷自己不為最后一個非deamon線程僧免,那么調(diào)用thread->exit(false) 刑赶,并在其中拋出thread_end事件,jvm不退出懂衩。

2.如果線程退出時判斷自己為最后一個非deamon線程撞叨,那么調(diào)用before_exit() 方法,拋出兩個事件:? 事件1:thread_end 線程結(jié)束事件浊洞、事件2:VM的death事件牵敷。

然后調(diào)用thread->exit(true) 方法,接下來把線程從active list卸下沛申,刪除線程等等一系列工作執(zhí)行完成后劣领,則通知正在等待的DestroyJavaVM 線程執(zhí)行卸載JVM操作。

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

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

Dispatcher-Thread-3? 線程 Log4j ????? Log4j具有異步打印日志的功能铁材,需要異步打印日志的Appender都需要注冊到 AsyncAppender對象里面去尖淘,由AsyncAppender進行監(jiān)聽奕锌,決定何時觸發(fā)日志打印操作。 AsyncAppender如果監(jiān)聽到它管轄范圍內(nèi)的Appender有打印日志的操作村生,則給這個Appender生成一個相應(yīng)的event惊暴,并將該event保存在一個buffuer區(qū)域內(nèi)。? Dispatcher-Thread-3線程負(fù)責(zé)判斷這個event緩存區(qū)是否已經(jīng)滿了趁桃,如果已經(jīng)滿了辽话,則將緩存區(qū)內(nèi)的所有event分發(fā)到Appender容器里面去,那些注冊上來的Appender收到自己的event后卫病,則開始處理自己的日志打印工作油啤。 Dispatcher-Thread-3線程是一個守護線程。

Finalizer線程 JVM 這個線程也是在main線程之后創(chuàng)建的蟀苛,其優(yōu)先級為10益咬,主要用于在垃圾收集前,調(diào)用對象的finalize()方法帜平;關(guān)于Finalizer線程的幾點:

1) 只有當(dāng)開始一輪垃圾收集時幽告,才會開始調(diào)用finalize()方法;因此并不是所有對象的finalize()方法都會被執(zhí)行裆甩;

2) 該線程也是daemon線程冗锁,因此如果虛擬機中沒有其他非daemon線程,不管該線程有沒有執(zhí)行完finalize()方法嗤栓,JVM也會退出冻河;

3) JVM在垃圾收集時會將失去引用的對象包裝成Finalizer對象(Reference的實現(xiàn)),并放入ReferenceQueue茉帅,由Finalizer線程來處理芋绸;最后將該Finalizer對象的引用置為null,由垃圾收集器來回收担敌;

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

Gang worker#0 JVM JVM 用于做新生代垃圾回收(monir gc)的一個線程桃犬。#號后面是線程編號刹悴,例如:Gang worker#1

GC Daemon JVM GC Daemon 線程是JVM為RMI提供遠(yuǎn)程分布式GC使用的,GC Daemon線程里面會主動調(diào)用System.gc()方法攒暇,對服務(wù)器進行Full GC土匀。 其初衷是當(dāng) RMI 服務(wù)器返回一個對象到其客戶機(遠(yuǎn)程方法的調(diào)用方)時,其跟蹤遠(yuǎn)程對象在客戶機中的使用形用。當(dāng)再沒有更多的對客戶機上遠(yuǎn)程對象的引用時就轧,或者如果引用的“租借”過期并且沒有更新证杭,服務(wù)器將垃圾回收遠(yuǎn)程對象。

不過妒御,我們現(xiàn)在jvm啟動參數(shù)都加上了-XX:+DisableExplicitGC配置解愤,所以,這個線程只有打醬油的份了乎莉。

IdleRemover JBOSS Jboss連接池有一個最小值送讲, 該線程每過一段時間都會被Jboss喚起,用于檢查和銷毀連接池中空閑和無效的連接惋啃,直到剩余的連接數(shù)小于等于它的最小值哼鬓。

Java2D Disposer JVM ????????? 這個線程主要服務(wù)于awt的各個組件。 說起該線程的主要工作職責(zé)前边灭,需要先介紹一下Disposer類是干嘛的异希。 Disposer提供一個addRecord方法。 如果你想在一個對象被銷毀前再做一些善后工作存筏,那么宠互,你可以調(diào)用Disposer#addRecord方法,將這個對象和一個自定義的DisposerRecord接口實現(xiàn)類椭坚,一起傳入進去予跌,進行注冊。

Disposer類會喚起“Java2D Disposer”線程善茎,該線程會掃描已注冊的這些對象是否要被回收了券册,如果是,則調(diào)用該對象對應(yīng)的DisposerRecord實現(xiàn)類里面的dispose方法垂涯。

Disposer實際上不限于在awt應(yīng)用場景烁焙,只是awt里面的很多組件需要訪問很多操作系統(tǒng)資源,所以耕赘,這些組件在被回收時骄蝇,需要先釋放這些資源。

InsttoolCacheScheduler_

QuartzSchedulerThread Quartz ??????? InsttoolCacheScheduler_QuartzSchedulerThread是Quartz的主線程操骡,它主要負(fù)責(zé)實時的獲取下一個時間點要觸發(fā)的觸發(fā)器九火,然后執(zhí)行觸發(fā)器相關(guān)聯(lián)的作業(yè) 。

原理大致如下:

Spring和Quartz結(jié)合使用的場景下册招,Spring IOC容器初始化時會創(chuàng)建并初始化Quartz線程池(TreadPool)岔激,并啟動它。剛啟動時線程池中每個線程都處于等待狀態(tài)是掰,等待外界給他分配Runnable(持有作業(yè)對象的線程)虑鼎。

繼而接著初始化并啟動Quartz的主線程(InsttoolCacheScheduler_QuartzSchedulerThread),該線程自啟動后就會處于等待狀態(tài)。等待外界給出工作信號之后炫彩,該主線程的run方法才實質(zhì)上開始工作匾七。run中會獲取JobStore中下一次要觸發(fā)的作業(yè),拿到之后會一直等待到該作業(yè)的真正觸發(fā)時間媒楼,然后將該作業(yè)包裝成一個JobRunShell對象(該對象實現(xiàn)了Runnable接口乐尊,其實看是上面TreadPool中等待外界分配給他的Runnable),然后將剛創(chuàng)建的JobRunShell交給線程池划址,由線程池負(fù)責(zé)執(zhí)行作業(yè)扔嵌。

線程池收到Runnable后,從線程池一個線程啟動Runnable夺颤,反射調(diào)用JobRunShell中的run方法痢缎,run方法執(zhí)行完成之后, TreadPool將該線程回收至空閑線程中世澜。

InsttoolCacheScheduler_Worker-2 Quartz InsttoolCacheScheduler_Worker-2線程就是ThreadPool線程的一個簡單實現(xiàn)独旷,它主要負(fù)責(zé)分配線程資源去執(zhí)行

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

JBossLifeThread Jboss ??????? Jboss主線程啟動成功寥裂,應(yīng)用程序部署完畢之后將JBossLifeThread線程實例化并且start嵌洼,JBossLifeThread線程啟動成功之后就處于等待狀態(tài),以保持Jboss Java進程處于存活中封恰。? 所得比較通俗一點麻养,就是Jboss啟動流程執(zhí)行完畢之后,為什么沒有結(jié)束诺舔? 就是因為有這個線程hold主了它鳖昌。 牛b吧~~

JBoss System Threads(1)-1 Jboss ? 該線程是一個socket服務(wù),默認(rèn)端口號為: 1099低飒。 主要用于接收外部naming service(Jboss? JNDI)請求许昨。

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

Jboss內(nèi)部凡是有遠(yuǎn)程連接需求的類褥赊,都需要實現(xiàn)ManagedConnectionFactory接口糕档,例如需要做JDBC連接的

XAManagedConnectionFactory對象,就實現(xiàn)了該接口拌喉。然后將XAManagedConnectionFactory對象翼岁,還有其它信息一起包裝到InternalManagedConnectionPool對象里面,接著將InternalManagedConnectionPool交給PoolFiller對象里面的列隊進行管理司光。?? JCA PoolFiller線程會定期判斷列隊內(nèi)是否有需要創(chuàng)建和管理的InternalManagedConnectionPool對象,如果有的話悉患,則調(diào)用該對象的fillToMin方法残家, 觸發(fā)它去創(chuàng)建相應(yīng)的遠(yuǎn)程連接,并且將這個連接維護到它相應(yīng)的連接池里面去售躁。

JDWP Event Helper Thread JVM

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

JDWP Transport Listener: dt_socket JVM 該線程是一個Java Debugger的監(jiān)聽器線程烁涌,負(fù)責(zé)受理客戶端的debug請求。 通常我們習(xí)慣將它的監(jiān)聽端口設(shè)置為8787酒觅。

Low Memory Detector JVM 這個線程是負(fù)責(zé)對可使用內(nèi)存進行檢測撮执,如果發(fā)現(xiàn)可用內(nèi)存低,分配新的內(nèi)存空間舷丹。

process reaper JVM ??? 該線程負(fù)責(zé)去執(zhí)行一個 OS 命令行的操作抒钱。

Reference Handler JVM ??????? JVM在創(chuàng)建main線程后就創(chuàng)建Reference Handler線程,其優(yōu)先級最高颜凯,為10谋币,它主要用于處理引用對象本身(軟引用、弱引用症概、虛引用)的垃圾回收問題 蕾额。

Surrogate Locker Thread (CMS) JVM ????????? 這個線程主要用于配合CMS垃圾回收器使用,它是一個守護線程穴豫,其主要負(fù)責(zé)處理GC過程中凡简,Java層的Reference(指軟引用、弱引用等等)與jvm 內(nèi)部層面的對象狀態(tài)同步精肃。 這里對它們的實現(xiàn)稍微做一下介紹:這里拿 WeakHashMap做例子秤涩,將一些關(guān)鍵點先列出來(我們后面會將這些關(guān)鍵點全部串起來):

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

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

3.? Reference 里面有一個全局鎖對象:Lock习柠,它也被稱為pending_lock.??? 注意:它是靜態(tài)對象匀谣。

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

5.? Reference? 里面有一個靜態(tài)內(nèi)部類:ReferenceHandler的線程资溃,它在static塊里面被初始化并且啟動武翎,啟動完成后處于wait狀態(tài),它在一個Lock同步鎖模塊中等待溶锭。

6.? 另外宝恶,WeakHashMap里面還實例化了一個ReferenceQueue列隊,這個列隊的作用,后面會提到垫毙。

7.? 上面關(guān)鍵點就介紹完畢了霹疫,下面我們把他們串起來。

假設(shè)综芥,WeakHashMap對象里面已經(jīng)保存了很多對象的引用丽蝎。 JVM 在進行CMS GC的時候,會創(chuàng)建一個ConcurrentMarkSweepThread(簡稱CMST)線程去進行GC膀藐,ConcurrentMarkSweepThread線程被創(chuàng)建的同時會創(chuàng)建一個SurrogateLockerThread(簡稱SLT)線程并且啟動它屠阻,SLT啟動之后,處于等待階段消请。CMST開始GC時栏笆,會發(fā)一個消息給SLT讓它去獲取Java層Reference對象的全局鎖:Lock。 直到CMS GC完畢之后臊泰,JVM 會將WeakHashMap中所有被回收的對象所屬的WeakReference容器對象放入到Reference 的pending屬性當(dāng)中(每次GC完畢之后蛉加,pending屬性基本上都不會為null了),然后通知SLT釋放并且notify全局鎖:Lock缸逃。此時激活了ReferenceHandler線程的run方法针饥,使其脫離wait狀態(tài),開始工作了需频。ReferenceHandler這個線程會將pending中的所有WeakReference對象都移動到它們各自的列隊當(dāng)中丁眼,比如當(dāng)前這個WeakReference屬于某個WeakHashMap對象,那么它就會被放入相應(yīng)的ReferenceQueue列隊里面(該列隊是鏈表結(jié)構(gòu))昭殉。 當(dāng)我們下次從WeakHashMap對象里面get苞七、put數(shù)據(jù)或者調(diào)用size方法的時候,WeakHashMap就會將ReferenceQueue列隊中的WeakReference依依poll出來去和Entry[]數(shù)據(jù)做比較挪丢,如果發(fā)現(xiàn)相同的蹂风,則說明這個Entry所保存的對象已經(jīng)被GC掉了,那么將Entry[]內(nèi)的Entry對象剔除掉乾蓬。

taskObjectTimerFactory JVM ????????? 顧名思義惠啄,該線程就是用來執(zhí)行任務(wù)的。 當(dāng)我們把一個認(rèn)為交給Timer對象任内,并且告訴它執(zhí)行時間撵渡,周期時間后,Timer就會將該任務(wù)放入任務(wù)列隊死嗦,并且通知taskObjectTimerFactory線程去處理任務(wù)趋距,taskObjectTimerFactory線程會將狀態(tài)為取消的任務(wù)從任務(wù)列隊中移除,如果任務(wù)是非重復(fù)執(zhí)行類型的越除,則在執(zhí)行完該任務(wù)后节腐,將它從任務(wù)列隊中移除靠欢,如果該任務(wù)是需要重復(fù)執(zhí)行的,則計算出它下一次執(zhí)行的時間點铜跑。

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

jstat -gcutil 23483 250 7?? 這個命令告訴jvm在控制臺打印PID為:23483的gc情況护锤,間隔250毫秒打印一次官地,一共打印7次。

VM Thread JVM ???????? 這個線程就比較牛b了烙懦,是jvm里面的線程母體驱入,根據(jù)hotspot源碼(vmThread.hpp)里面的注釋,它是一個單例的對象(最原始的線程)會產(chǎn)生或觸發(fā)所有其他的線程氯析,這個單個的VM線程是會被其他線程所使用來做一些VM操作(如亏较,清掃垃圾等)。

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

ps:VM操作類型被定義在vm_operations.hpp文件內(nèi)舍哄,列舉幾個:ThreadStop宴凉、ThreadDump、PrintThreads蠢熄、GenCollectFull跪解、GenCollectFullConcurrent、CMS_Initial_Mark签孔、CMS_Final_Remark….. 有興趣的同學(xué)叉讥,可以自己去查看源文件。

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

2.Jmap

2.1?? 得到運行java程序的內(nèi)存分配的詳細(xì)情況饥追。例如實例個數(shù)图仓,大小等

2.2?? 命名行格式

jmap [ option ] pid

jmap [ option ] executable core

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

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

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

-heap 打印heap的概要信息但绕,GC使用的算法救崔,heap的配置及wise heap的使用情況.

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

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

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

-h | -help 打印輔助信息

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

2.3?? 使用例子

jmap -histo pid(查看實例)

jmap -dump:format=b,file=heap.bin pid(導(dǎo)出內(nèi)存惶看,據(jù)說對性能有影響,小心使用)

(format=b是通過二進制的意思六孵,但是能不能導(dǎo)出文本文件我沒找到纬黎,知道的告訴我)

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

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

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

上面的是eclipse分析內(nèi)存泄漏分析出的冠息。這個功能點非常多≡兴鳎可以慢慢學(xué)習(xí)

3.Jstat

3.1?? 這是一個比較實用的一個命令逛艰,可以觀察到classloader,compiler搞旭,gc相關(guān)信息散怖。可以時時監(jiān)控資源和性能

3.2????? 命令格式

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

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

-gc:統(tǒng)計jdk gc時heap信息

-gccapacity:統(tǒng)計不同的generations(不知道怎么翻譯好选脊,包括新生區(qū)杭抠,老年區(qū),permanent區(qū))相應(yīng)的heap容量情況

-gccause:統(tǒng)計gc的情況恳啥,(同-gcutil)和引起gc的事件

-gcnew:統(tǒng)計gc時偏灿,新生代的情況

-gcnewcapacity:統(tǒng)計gc時,新生代heap容量

-gcold:統(tǒng)計gc時钝的,老年區(qū)的情況

-gcoldcapacity:統(tǒng)計gc時翁垂,老年區(qū)heap容量

-gcpermcapacity:統(tǒng)計gc時,permanent區(qū)heap容量

-gcutil:統(tǒng)計gc時硝桩,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)用程序啟動到采樣時發(fā)生 Young GC 的次數(shù)

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

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

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

GCT — 從應(yīng)用程序啟動到采樣時用于垃圾回收的總時間(單位秒)沿猜,它的值等于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)存占用量)

這個工具的參數(shù)非常多,據(jù)說基本能覆蓋jprofile等收費工具的所有功能了衙伶。多用用對于系統(tǒng)調(diào)優(yōu)還是很有幫助的

注1:我們在daily用這樣命令時祈坠,都要用-F參數(shù)的。因為我們的用戶都不是啟動命令的用戶

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芬沉,一起剝皮案震驚了整個濱河市躺同,隨后出現(xiàn)的幾起案子阁猜,更是在濱河造成了極大的恐慌,老刑警劉巖蹋艺,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剃袍,死亡現(xiàn)場離奇詭異,居然都是意外死亡捎谨,警方通過查閱死者的電腦和手機笛园,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侍芝,“玉大人,你說我怎么就攤上這事埋同≈莸” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵凶赁,是天一觀的道長咧栗。 經(jīng)常有香客問我,道長虱肄,這世上最難降的妖魔是什么致板? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮咏窿,結(jié)果婚禮上斟或,老公的妹妹穿的比我還像新娘。我一直安慰自己集嵌,他們只是感情好萝挤,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著根欧,像睡著了一般怜珍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凤粗,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天酥泛,我揣著相機與錄音,去河邊找鬼嫌拣。 笑死柔袁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亭罪。 我是一名探鬼主播瘦馍,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼应役!你這毒婦竟也來了情组?” 一聲冷哼從身側(cè)響起燥筷,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎院崇,沒想到半個月后肆氓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡底瓣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年谢揪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捐凭。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡拨扶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茁肠,到底是詐尸還是另有隱情患民,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布垦梆,位于F島的核電站匹颤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏托猩。R本人自食惡果不足惜印蓖,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望京腥。 院中可真熱鬧赦肃,春花似錦、人聲如沸公浪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽因悲。三九已至堕汞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晃琳,已是汗流浹背讯检。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卫旱,地道東北人人灼。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓辨泳,卻偏偏與公主長得像球及,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子绒北,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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