linux下分析java程序占用CPU、內存過高


一、CPU過高分析

1)使用TOP命令查看CPU、內存使用狀態可以發現CPU占用主要分為兩部分,一部分為系統內核空間占用CPU百分比,一部分為用戶空間占用CPU百分比。其中CPU狀態中標示id的為空閑CPU百分比。當空閑CPU百分比越低,說明CPU占用率越高。

2)目前針對Linux下java進程占用CPU高的分析手段主要為使用linux命令查出高CPU使用的進程,前分析其是由於進程原因還是系統原因,在分析出為進程消耗過高CPU后列出占用CPU高和占用時間最長的線程並使用jdk自帶的jstack工具進行分析CPU使用分析。

jstack命令

通過top命令定位到cpu占用率較高的線程之后,繼續使用jstack pid命令查看當前java進程的堆棧狀態

參數說明:
  • -l 長列表. 打印關於鎖的附加信息,例如屬於java.util.concurrent 的 ownable synchronizers列表.
  • -F 當’jstack [-l] pid’沒有相應的時候強制打印棧信息
  • -m 打印java和native c/c++框架的所有棧信息.
  • -h | -help 打印幫助信息
jstack命令生成的thread dump信息包含了JVM中所有存活的線程,為了分析指定線程,必須找出對應線程的調用棧,應該如何找?在top命令中,已經獲取到了占用cpu資源較高的線程pid,將該pid轉成16進制的值,在thread dump中每個線程都有一個nid,找到對應的nid即可;隔段時間再執行一次stack命令獲取thread dump,區分兩份dump是否有差別,在nid=0x246c的線程調用棧中,發現該線程一直在執行JstackCase類第33行的calculate方法,得到這個信息,就可以檢查對應的代碼是否有問題。

通過thread dump分析線程狀態:除了上述的分析,大多數情況下會基於thead dump分析當前各個線程的運行情況,如是否存在死鎖、是否存在一個線程長時間持有鎖不放等。在dump中,線程一般存在如下幾種狀態:1、RUNNABLE,線程處於執行中2、BLOCKED,線程被阻塞3、WAITING,線程正在等待實例1:多線程競爭synchronized鎖

很明顯:線程1獲取到鎖,處於RUNNABLE狀態,線程2處於BLOCK狀態1、locked <0x000000076bf62208>說明線程1對地址為0x000000076bf62208對象進行了加鎖;2、waiting to lock <0x000000076bf62208> 說明線程2在等待地址為0x000000076bf62208對象上的鎖;3、waiting for monitor entry [0x000000001e21f000]說明線程1是通過synchronized關鍵字進入了監視器的臨界區,並處於"Entry Set"隊列,等待monitor。

二、內存過高分析

使用pmap查看進程內存

命令格式:

pmap 進程id

第一列。內存塊起始地址

第二列。占用內存大小

第三列,內存權限

第四列。內存名稱。anon表示動態分配的內存,stack表示棧內存

最后一行。占用內存總大小,請注意,此處為虛擬內存大小,占用的物理內存大小能夠通過top查看

使用jmap查看Java進程對象使用情況

命令格式:

jmap -histo 進程id

第一列,序號。

第二列,對象實例數量

第三列,對象實例占用總內存數。單位:字節

第四列,對象實例名稱

最后一行,總實例數量與總內存占用數

使用jstat查看Java內存分布及回收情況

通常運行命令如下:

jstat -gc 15712 5000

即會每5秒一次顯示進程號為15712的java進成的GC情況,

- S0C: Young Generation第一個survivor space的內存大小 (kB).

- S1C: Young Generation第二個survivor space的內存大小 (kB).

- S0U: Young Generation第一個Survivor space當前已使用的內存大小 (kB).

- S1U: Young Generation第二個Survivor space當前已經使用的內存大小 (kB).

- EC: Young Generation中eden space的內存大小 (kB).

- EU: Young Generation中Eden space當前已使用的內存大小 (kB).

- OC: Old Generation的內存大小 (kB).

- OU: Old Generation當前已使用的內存大小 (kB).

- MC: Permanent Generation的內存大小 (kB)

- MU: Permanent Generation當前已使用的內存大小 (kB).

- YGC: 從啟動到采樣時Young Generation GC的次數

- YGCT: 從啟動到采樣時Young Generation GC所用的時間 (s).

- FGC: 從啟動到采樣時Old Generation GC的次數.

- FGCT: 從啟動到采樣時Old Generation GC所用的時間 (s).

- GCT: 從啟動到采樣時GC所用的總時間 (s).


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM