java程序員除了編寫業務代碼之外,特別是項目上線之后,更需要關注的是系統的性能表現,這個時候就需要了解一下jvm的性能表現了,可以借助於java虛擬機自帶的一些分析工具,主要有三個常用的命令。
1. jmap
這個命令是用來查看當前系統中jvm進程 heap dump的情況,包括對象的數量,對象所占內存的大小
使用方式:先使用jps查看進程id
使用 jmap -dump:live,file=b.map 22467 將live進程生成java堆轉儲快照
使用 jmap -heap PID 生成java堆的詳細信息
使用 jmap -histo PID 生成java堆中對象的相關信息,包含數量以及占用的空間大小
2. jstat
主要是用來監控 heap size 和 jvm垃圾回收情況,尤其是gc情況的監控,如果老年代發生full gc,那么很可能會導致內存泄漏的可能性
可以看到新生代survivor S0, survivor S1 heap上的空間 使用百分比,堆中新生代Eden 的空間使用百分比,老年代Old 空間的使用百分比,內存的使用百分比,新生代Yong gc 的統計次數,新生代gc 花費的時間,full gc 的次數,花費的時間,當前進程總的gc時間,這里要注意一點,full gc很具有代表性,full gc次數 和時間 指標很能顯示系統性能問題,這兩個指標很大,很大程度上說明了程序中有問題,垃圾一直回收不掉
3. jstack
先使用 top 查看系統中消耗cpu比較多的進程,然后使用 top -p PID -H來查看當前進程中比較消耗cpu的線程,拿到消耗cpu比較高的線程pid,先轉換成16進制的,最后使用jstack pid|grep 16進制的線程id
jstack -pid可以用來分析進程情況