java內(nèi)存文件jump和線程堆棧輸出

概述

某天系統(tǒng)響應(yīng)變慢需要分析原因昵观,也許我們馬上會(huì)想起java core分析三板斧舀透,top枝冀、pid等等定位到線程使用jstack命令輸出線程堆棧司训。那么如果是內(nèi)存回收不掉的情況呢?也許你的系統(tǒng)已配置-XX HeapDumOnMemoryError独郎,

-XX HeapDumpPath=XXX踩麦,但是一旦如果你沒設(shè)置而且系統(tǒng)并沒內(nèi)存溢出,只是響應(yīng)慢囚聚,回收不理想呢靖榕?這時(shí)候用什么命令呢?當(dāng)然這個(gè)可以現(xiàn)查現(xiàn)用顽铸,但如果是在面試呢茁计?也許你知道但是不記得了,但這個(gè)簡單問題很可能直接會(huì)讓面試官認(rèn)為你沒做過或者不知道,所以簡單整理一下星压。

總結(jié)

一践剂、jmap命令解析與使用

jmap -heap [pid] 查詢內(nèi)存使用情況

[root@fengniaoweb ~]# jmap -heap 2865
Attaching to process ID 2865, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.211-b12
?
using thread-local object allocation.
Parallel GC with 4 thread(s)
?
Heap Configuration:
 MinHeapFreeRatio         = 0
 MaxHeapFreeRatio         = 100
 MaxHeapSize              = 268435456 (256.0MB)
 NewSize                  = 42991616 (41.0MB)
 MaxNewSize               = 89128960 (85.0MB)
 OldSize                  = 87031808 (83.0MB)
 NewRatio                 = 2
 SurvivorRatio            = 8
 MetaspaceSize            = 21807104 (20.796875MB)
 CompressedClassSpaceSize = 1073741824 (1024.0MB)
 MaxMetaspaceSize         = 17592186044415 MB
 G1HeapRegionSize         = 0 (0.0MB)
?
Heap Usage:
PS Young Generation
Eden Space:
 capacity = 88080384 (84.0MB)
 used     = 86317448 (82.31873321533203MB)
 free     = 1762936 (1.6812667846679688MB)
 97.99849192301433% used
From Space:
 capacity = 524288 (0.5MB)
 used     = 32768 (0.03125MB)
 free     = 491520 (0.46875MB)
 6.25% used
To Space:
 capacity = 524288 (0.5MB)
 used     = 0 (0.0MB)
 free     = 524288 (0.5MB)
 0.0% used
PS Old Generation
 capacity = 179306496 (171.0MB)
 used     = 74843440 (71.37626647949219MB)
 free     = 104463056 (99.62373352050781MB)
 41.74050671315332% used
?
26363 interned Strings occupying 3142776 bytes.

要注意的是在使用CMS GC 情況下,jmap -heap的執(zhí)行有可能會(huì)導(dǎo)致JAVA 進(jìn)程掛起

jmap -histo [pid] 查看JVM堆中對象詳細(xì)占用情況

// 限于篇幅僅粘貼示例
3007:             1             16  [Lorg.aspectj.weaver.ast.Var;
3008:             1             16  [Lorg.aspectj.weaver.patterns.AnnotationTypePattern;
3009:             1             16  [Lorg.aspectj.weaver.patterns.BindingPattern;
3010:             1             16  [Lorg.aspectj.weaver.tools.PointcutParameter;
3011:             1             16  [Lorg.springframework.web.context.request.async.CallableProcessingInterceptor;
3012:             1             16  [Lorg.springframework.web.context.request.async.DeferredResultProcessingInterceptor;
3013:             1             16  [Lsun.reflect.annotation.TypeAnnotation$LocationInfo$Location;
3014:             1             16  [[Lorg.aspectj.weaver.AnnotationAJ;
3015:             1             16  com.alibaba.fastjson.parser.deserializer.CharArrayDeserializer
3016:             1             16  com.alibaba.fastjson.parser.deserializer.ClassDerializer
3017:             1             16  com.alibaba.fastjson.parser.deserializer.CollectionDeserializer
3018:             1             16  com.alibaba.fastjson.parser.deserializer.DateDeserializer
3019:             1             16  com.alibaba.fastjson.parser.deserializer.DateFormatDeserializer
3020:             1             16  com.alibaba.fastjson.parser.deserializer.JSONArrayDeserializer
3021:             1             16  com.alibaba.fastjson.parser.deserializer.JSONObjectDeserializer
3022:             1             16  com.alibaba.fastjson.parser.deserializer.JavaObjectDeserializer
3023:             1             16  com.alibaba.fastjson.parser.deserializer.Jdk8DateCodec
3024:             1             16  com.alibaba.fastjson.parser.deserializer.MapDeserializer
3025:             1             16  com.alibaba.fastjson.parser.deserializer.NumberDeserializer
3026:             1             16  com.alibaba.fastjson.parser.deserializer.SqlDateDeserializer
3027:             1             16  com.alibaba.fastjson.parser.deserializer.StackTraceElementDeserializer
3028:             1             16  com.alibaba.fastjson.parser.deserializer.TimeDeserializer
3029:             1             16  com.alibaba.fastjson.parser.deserializer.TimestampDeserializer

jmap -dump:format=b,file=文件名 [pid]

[root@fengniaoweb home]# jmap -dump:format=b,file=heapsim 2865  
Dumping heap to /home/heapsim ...
Heap dump file created
[root@fengniaoweb home]# ls
apollo  heapsim
[root@fengniaoweb home]# 

在當(dāng)前目錄下生成內(nèi)存dump文件

二娜膘、內(nèi)存快照分析工具

jhat java自帶的內(nèi)存快照分析工具 一般不常用逊脯,因?yàn)橛斜緳C(jī)內(nèi)存限制,不易于分析大內(nèi)存文件

eclipse Memory Analyzer

Eclipse 提供的一個(gè)用于分析JVM 堆Dump文件的插件竣贪。借助這個(gè)插件可查看對象的內(nèi)存占用狀況军洼,引用關(guān)系,分析內(nèi)存泄露等演怎。

具體的分析過程不作為本文討論重點(diǎn)匕争,這里就不詳細(xì)討論了。

三爷耀、kill -3 [pid] 輸出線程堆棧信息

當(dāng)系統(tǒng)負(fù)載較高響應(yīng)較慢的時(shí)候或者未安裝jstack命令時(shí)可以使用該命令打印java進(jìn)程堆棧信息甘桑。

  • 如果項(xiàng)目通過Tomcat進(jìn)行發(fā)布(普通的web項(xiàng)目),則對應(yīng)的堆棧信息會(huì)打印在catalina.out文件中歹叮。

  • 如果項(xiàng)目是基于SpringBoot并且使用nohup java -jar xxx.jar & 命令運(yùn)行跑杭,則java堆棧信息會(huì)在jar包所在的nohup.out文件中。

注意:該命令并不會(huì)殺死jvm進(jìn)程

[root@fengniaoweb logs]# kill -3 2865
// 在nohup文件中發(fā)現(xiàn)如下堆棧信息
"JDWP Event Helper Thread" #6 daemon prio=10 os_prio=0 tid=0x00007f80c818f000 nid=0xb3c runnable [0x0000000000000000]
 java.lang.Thread.State: RUNNABLE
?
"JDWP Transport Listener: dt_socket" #5 daemon prio=10 os_prio=0 tid=0x00007f80c818b800 nid=0xb3b runnable [0x0000000000000000]
 java.lang.Thread.State: RUNNABLE
?
"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007f80c817f800 nid=0xb3a waiting on condition [0x0000000000000000]
 java.lang.Thread.State: RUNNABLE
?
"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f80c814d800 nid=0xb39 in Object.wait() [0x00007f80cc16c000]
 java.lang.Thread.State: WAITING (on object monitor)
 at java.lang.Object.wait(Native Method)
 at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
 - locked <0x00000000f008a960> (a java.lang.ref.ReferenceQueue$Lock)
 at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
 at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
?
"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f80c814a800 nid=0xb38 in Object.wait() [0x00007f80b1f31000]
 java.lang.Thread.State: WAITING (on object monitor)
 at java.lang.Object.wait(Native Method)
 at java.lang.Object.wait(Object.java:502)
 at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
 - locked <0x00000000f008a990> (a java.lang.ref.Reference$Lock)
 at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
?
"VM Thread" os_prio=0 tid=0x00007f80c8141000 nid=0xb37 runnable 
?
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f80c8021000 nid=0xb33 runnable 
?
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f80c8022800 nid=0xb34 runnable 
?
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f80c8024800 nid=0xb35 runnable 
?
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f80c8026800 nid=0xb36 runnable

四咆耿、 jstack [pid] jvm自帶的堆棧工具

通過該工具可以看到JVM 中線程的運(yùn)行狀況德谅,包括鎖等待,線程是否在運(yùn)行票灰,線程的所有堆棧信息

[root@fengniaoweb logs]# jstack 2865
Attaching to process ID 2865, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.211-b12
Deadlock Detection:
?
No deadlocks found.
?
Thread 20440: (state = BLOCKED)
?
?
Thread 11659: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=144 (Compiled frame)
 - java.lang.ref.ReferenceQueue.remove() @bci=2, line=165 (Compiled frame)
 - org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ReferenceQueueThread.run() @bci=10, line=1122 (Interpreted frame)
?
?
Thread 10425: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=144 (Compiled frame)
 - com.mysql.jdbc.AbandonedConnectionCleanupThread.run() @bci=10, line=64 (Compiled frame)
 - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=95, line=1149 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=624 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)
?
?
Thread 10424: (state = BLOCKED)
 - java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.util.TimerThread.mainLoop() @bci=201, line=552 (Compiled frame)
 - java.util.TimerThread.run() @bci=1, line=505 (Interpreted frame)
?
?
Thread 2866: (state = BLOCKED)
?
?
Thread 3079: (state = BLOCKED)
 - java.lang.Thread.sleep(long) @bci=0 (Compiled frame; information may be imprecise)
 - org.apache.coyote.AbstractProtocol$AsyncTimeout.run() @bci=10, line=1133 (Compiled frame)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)
?
?
Thread 3078: (state = IN_NATIVE)
 - sun.nio.ch.ServerSocketChannelImpl.accept0(java.io.FileDescriptor, java.io.FileDescriptor, java.net.InetSocketAddress[]) @bci=0 (Compiled frame; information may be imprecise)
 - sun.nio.ch.ServerSocketChannelImpl.accept(java.io.FileDescriptor, java.io.FileDescriptor, java.net.InetSocketAddress[]) @bci=4, line=422 (Compiled frame)
 - sun.nio.ch.ServerSocketChannelImpl.accept() @bci=130, line=250 (Compiled frame)
 - org.apache.tomcat.util.net.NioEndpoint$Acceptor.run() @bci=88, line=455 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)
?
?
Thread 3077: (state = IN_NATIVE)
 - sun.nio.ch.EPollArrayWrapper.epollWait(long, int, long, int) @bci=0 (Compiled frame; information may be imprecise)
 - sun.nio.ch.EPollArrayWrapper.poll(long) @bci=18, line=269 (Compiled frame)
 - sun.nio.ch.EPollSelectorImpl.doSelect(long) @bci=28, line=93 (Compiled frame)
 - sun.nio.ch.SelectorImpl.lockAndDoSelect(long) @bci=37, line=86 (Compiled frame)
 - sun.nio.ch.SelectorImpl.select(long) @bci=30, line=97 (Compiled frame)
 - org.apache.tomcat.util.net.NioEndpoint$Poller.run() @bci=55, line=793 (Compiled frame)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)
?
?
Thread 3076: (state = IN_NATIVE)
 - sun.nio.ch.EPollArrayWrapper.epollWait(long, int, long, int) @bci=0 (Compiled frame; information may be imprecise)
 - sun.nio.ch.EPollArrayWrapper.poll(long) @bci=18, line=269 (Compiled frame)
 - sun.nio.ch.EPollSelectorImpl.doSelect(long) @bci=28, line=93 (Compiled frame)
 - sun.nio.ch.SelectorImpl.lockAndDoSelect(long) @bci=37, line=86 (Compiled frame)
 - sun.nio.ch.SelectorImpl.select(long) @bci=30, line=97 (Compiled frame)
 - org.apache.tomcat.util.net.NioEndpoint$Poller.run() @bci=55, line=793 (Compiled frame)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)

關(guān)于jstack命令的詳細(xì)講解可以參考

https://www.cnblogs.com/xingzc/p/5778010.html

附加:

命令格式 top -Hp pid -d 1 -n 1

打印進(jìn)程號為pid的進(jìn)程所有子線程的cpu女阀,內(nèi)存等資源占用情況宅荤。

該命令結(jié)合線程堆椥加兀可以分析線程資源占用問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冯键,隨后出現(xiàn)的幾起案子惹盼,更是在濱河造成了極大的恐慌,老刑警劉巖惫确,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件手报,死亡現(xiàn)場離奇詭異,居然都是意外死亡改化,警方通過查閱死者的電腦和手機(jī)掩蛤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陈肛,“玉大人揍鸟,你說我怎么就攤上這事【浜担” “怎么了阳藻?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵晰奖,是天一觀的道長。 經(jīng)常有香客問我腥泥,道長匾南,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任蛔外,我火速辦了婚禮蛆楞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夹厌。我一直安慰自己臊岸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布尊流。 她就那樣靜靜地躺著帅戒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崖技。 梳的紋絲不亂的頭發(fā)上逻住,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音迎献,去河邊找鬼瞎访。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吁恍,可吹牛的內(nèi)容都是我干的扒秸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冀瓦,長吁一口氣:“原來是場噩夢啊……” “哼伴奥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起翼闽,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤拾徙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后感局,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尼啡,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年询微,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崖瞭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撑毛,死狀恐怖书聚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤寺惫,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布疹吃,位于F島的核電站,受9級特大地震影響西雀,放射性物質(zhì)發(fā)生泄漏萨驶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一艇肴、第九天 我趴在偏房一處隱蔽的房頂上張望腔呜。 院中可真熱鬧,春花似錦再悼、人聲如沸核畴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谤草。三九已至,卻和暖如春莺奸,著一層夾襖步出監(jiān)牢的瞬間丑孩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工灭贷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留温学,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓甚疟,卻偏偏與公主長得像仗岖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子览妖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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