查看整個JVM內存狀態
jmap -heap [pid]
要注意的是在使用CMS GC 情況下,jmap -heap的執行有可能會導致JAVA 進程掛起
查看JVM堆中對象詳細占用情況
jmap -histo [pid]
可以通過jmap -histo [pid] | head -20查看top20的實例個數以及內存占用情況
導出整個JVM 中內存信息,可以通過eclipse的mat插件查看明細
jmap -dump:format=b,file=文件名 [pid]
jhat是sun 1.6及以上版本中自帶的一個用于分析JVM 堆DUMP 文件的工具,基于此工具可分析JVM HEAP 中對象的內存占用情況
jhat -J-Xmx1024M [file]
執行后等待console 中輸入start HTTP server on port 7000 即可使用瀏覽器訪問 IP:7000
eclipse Memory Analyzer
Eclipse 提供的一個用于分析JVM 堆Dump文件的插件。借助這個插件可查看對象的內存占用狀況,引用關系,分析內存泄露等。
kill -3 [pid]
在Linux 上找到Java所在的進程號,然后執行以上命令,線程的相關信息就輸出到console
jstack
jstack 是sun JDK 自帶的工具,通過該工具可以看到JVM 中線程的運行狀況,包括鎖等待,線程是否在運行
執行 jstack [pid] ,線程的所有堆棧信息
"http-8080-10" daemon prio=10 tid=x0a949bb60 nid=0x884? waiting for monitor entry [...]
"http-8080-10" 這個線程處于等待狀態。 waiting for monitor entry 如果在連續幾次輸出線程堆棧信息都存在于同一個或多個線程上時,則說明系統中有鎖競爭激烈,死鎖,或鎖餓死的想象。
“http-8080-11” daemon prio=10 tix=xxx nid=xxx in object.wait() [...]
java.lang.Thread.State:waiting (on object monitor)
該表示http-8080-11的線程處于對象的Wait 上,等待其他線程的喚醒,這也是線程池的常見用法。
“Low Memory Detector”daemon prio=10 tix=xx nid=xxx runnable [...] java.lang.Thread.State:runnable 表示“Low Memory Detector” 的線程處于Runable狀態,等待獲取CPU的使用權.