摘要:一問一答的形式輕松學習掌握java工具,
以一問一答的形式學習java工具
Q:檢查記憶體泄露的工具有?
A: jmap生成dump轉儲檔案,jhat可視化查看,
Q:某行程CPU使用率一直占滿,用什么工具可以排查?
A:
top -Hp pid找到最占CPU的執行緒
然后jstack來查找那個執行緒此時所處的堆疊,確定問題發生位置,
§ 各工具詳細介紹
§ jstack
全稱: JVM Stack Trance
作用: 查看某個java行程的堆疊情況, 可用于確認死鎖、IO等待、死回圈等問題,
命令用法:
- jstack pid
- 查看死鎖例子如下圖,找到wait的lock和已被鎖的lock

- 查看等待IO例子:

§ jstat
全稱:
作用:
查看行程中記憶體使用情況,但只能給出一些簡單統計資料
- 統計加載了多少類以及占用空間 jstat -class pid
- 統計編譯了多少檔案 jstat -compiler 10
Q: jstat -gcutil {pid} 2000 可以每隔2秒,對pid行程列印記憶體使用統計資訊,
gcutil的輸出如下

里面哪個百分比如果長期處于99%-100%會有OMM風險?(OutOfMemoryError)
A:
如果E和O即新生代、老年代記憶體區一直都處于滿的狀態,則很有可能會引發OMM風險,就像下面這個,

§ jmap
全稱: JVM Memory Map
作用:生成行程的記憶體堆快照
當需要看一下行程里是什么東西占用了過多記憶體時, 可以用jmap列印一下堆快照,
命令用法:
- 列印堆快照: jmap -dump:file=./dumpfile.dump 行程pid
- 查看特定類所占用的情況: jmap -histo:live 行程pid | grep 類名
Q: 用jmap檢查記憶體泄漏實體
我分了3次,每個1h呼叫jmap查看行程的記憶體實體,查看該時刻各物件數量
第一次查看情況如下:

第二次隔了2各小時,查看情況如下:

請問哪個物件可能有記憶體泄漏風險?
A:
ObjectA可能有泄露, 因為他的物件數量增加最快,說明物件一直在增加且很多無法進行gc釋放,
§ jhat
全稱: JVM Heap Analysis Tool
和jmap配合, 可以決議jmap生成的堆快照, 支持生成1個web行程供我們分析和查看,
命令用法:
- jhat -J-Xmx515M dumpfile.dump
此時就會啟動1個webServer,然后我們去訪問就行了

§ jdb
全稱:Java Debugger
作用:用來對core檔案和正在運行的Java行程進行實時地除錯,類似于c++里的gdb
常見用法:
- 啟動行程并除錯: jdb -classpath . Test
- 至二級除錯某行程: jdb -attach 8000 -sourcepath /Users/wefit/Development/study/java/jtest/src/
§ jcmd
作用:多功能的工具,可以用它來匯出堆、查看Java行程、匯出執行緒資訊、執行GC、還可以進行采樣分析,可以理解為1個性能調優時用的工具,
常見命令:
- 查看 當前機器上所有的 jvm 行程資訊: jcmd -l
- 查看指定行程的性能統計資訊: jcmd pid PerfCounter.print
- 列出當前運行的 java 行程可以執行的操作: jcmd PID help
- 查看執行緒堆疊資訊: jcmd PID Thread.print
- 查看堆記憶體資訊: jcmd PID GC.heap_dump FILE_NAME
§ jps
簡單記法: JVM process status
全名:Java Virtual Machine Process Status Tool
作用: 顯示 當前系統用戶 的 所有 Java行程情況及其行程號
常用命令:
- 查看行程jvm引數: jps -v
- 輸出程式main class的完整package名或程式的jar檔案完整路徑名: jps -l
- 輸出傳遞給main方法的引數: jps -m
§ jinfo
jvm infomation
作用:和jps功能類似, 但是支持根據指定pis查看指定行程
- 可以查看JVM引數、系統引數、調整jvm引數
- 但不支持查看java程式的記憶體使用情況
§ javap
把java位元組碼檔案反匯編為Java原始碼檔案,
§ javac
java編譯工具
javac的執行程序:

§ JDK可視化工具
§ jconsole
可監控jvm,即可監控本地jvm也可監控遠程jvm,管理應用程式,可以檢查死鎖等諸多問題,

§ jvisualvm
Q:
- jvisualvm可以監控遠程服務器的運行狀態
- 可以在java程式運行起來后再運行, 通過某些協議連接到java行程中,
- 運行時, 可以不需要配置配置環境、虛擬機引數等,
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237576.html
標籤:其他
