linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高
一、CPU過(guò)高分析
1)使用TOP命令查看CPU、內(nèi)存使用狀態(tài)可以發(fā)現(xiàn)CPU占用主要分為兩部分,一部分為系統(tǒng)內(nèi)核空間占用CPU百分比,一部分為用戶空間占用CPU百分比。其中CPU狀態(tài)中標(biāo)示id的為空閑CPU百分比。當(dāng)空閑CPU百分比越低,說(shuō)明CPU占用率越高。
2)目前針對(duì)Linux下java進(jìn)程占用CPU高的分析手段主要為使用linux命令查出高CPU使用的進(jìn)程,前分析其是由于進(jìn)程原因還是系統(tǒng)原因,在分析出為進(jìn)程消耗過(guò)高CPU后列出占用CPU高和占用時(shí)間最長(zhǎng)的線程并使用jdk自帶的jstack工具進(jìn)行分析CPU使用分析。
jstack命令
通過(guò)top命令定位到cpu占用率較高的線程之后,繼續(xù)使用jstack pid命令查看當(dāng)前java進(jìn)程的堆棧狀態(tài)
參數(shù)說(shuō)明:
-l 長(zhǎng)列表. 打印關(guān)于鎖的附加信息,例如屬于java.util.concurrent 的 ownable synchronizers列表.
-F 當(dāng)’jstack [-l] pid’沒(méi)有相應(yīng)的時(shí)候強(qiáng)制打印棧信息
-m 打印java和native c/c++框架的所有棧信息.
-h | -help 打印幫助信息
jstack命令生成的thread dump信息包含了JVM中所有存活的線程,為了分析指定線程,必須找出對(duì)應(yīng)線程的調(diào)用棧,應(yīng)該如何找?在top命令中,已經(jīng)獲取到了占用cpu資源較高的線程pid,將該pid轉(zhuǎn)成16進(jìn)制的值,在thread dump中每個(gè)線程都有一個(gè)nid,找到對(duì)應(yīng)的nid即可;隔段時(shí)間再執(zhí)行一次stack命令獲取thread dump,區(qū)分兩份dump是否有差別,在nid=0x246c的線程調(diào)用棧中,發(fā)現(xiàn)該線程一直在執(zhí)行JstackCase類第33行的calculate方法,得到這個(gè)信息,就可以檢查對(duì)應(yīng)的代碼是否有問(wèn)題。
通過(guò)thread dump分析線程狀態(tài):除了上述的分析,大多數(shù)情況下會(huì)基于thead dump分析當(dāng)前各個(gè)線程的運(yùn)行情況,如是否存在死鎖、是否存在一個(gè)線程長(zhǎng)時(shí)間持有鎖不放等。在dump中,線程一般存在如下幾種狀態(tài):1、RUNNABLE,線程處于執(zhí)行中2、BLOCKED,線程被阻塞3、WAITING,線程正在等待實(shí)例1:多線程競(jìng)爭(zhēng)synchronized鎖
很明顯:線程1獲取到鎖,處于RUNNABLE狀態(tài),線程2處于BLOCK狀態(tài)1、locked <0x000000076bf62208>說(shuō)明線程1對(duì)地址為0x000000076bf62208對(duì)象進(jìn)行了加鎖;2、waiting to lock <0x000000076bf62208>?說(shuō)明線程2在等待地址為0x000000076bf62208對(duì)象上的鎖;3、waiting for monitor entry [0x000000001e21f000]說(shuō)明線程1是通過(guò)synchronized關(guān)鍵字進(jìn)入了監(jiān)視器的臨界區(qū),并處于"Entry Set"隊(duì)列,等待monitor。
二、內(nèi)存過(guò)高分析
使用pmap查看進(jìn)程內(nèi)存
命令格式:
pmap 進(jìn)程id
第一列。內(nèi)存塊起始地址
第二列。占用內(nèi)存大小
第三列,內(nèi)存權(quán)限
第四列。內(nèi)存名稱。anon表示動(dòng)態(tài)分配的內(nèi)存,stack表示棧內(nèi)存
最后一行。占用內(nèi)存總大小,請(qǐng)注意,此處為虛擬內(nèi)存大小,占用的物理內(nèi)存大小能夠通過(guò)top查看
使用jmap查看Java進(jìn)程對(duì)象使用情況
命令格式:
jmap -histo?進(jìn)程id
第一列,序號(hào)。
第二列,對(duì)象實(shí)例數(shù)量
第三列,對(duì)象實(shí)例占用總內(nèi)存數(shù)。單位:字節(jié)
第四列,對(duì)象實(shí)例名稱
最后一行,總實(shí)例數(shù)量與總內(nèi)存占用數(shù)
使用jstat查看Java內(nèi)存分布及回收情況
通常運(yùn)行命令如下:
jstat -gc 15712 5000
即會(huì)每5秒一次顯示進(jìn)程號(hào)為15712的java進(jìn)成的GC情況,
- S0C: Young Generation第一個(gè)survivor space的內(nèi)存大小 (kB).
- S1C: Young Generation第二個(gè)survivor space的內(nèi)存大小 (kB).
- S0U: Young Generation第一個(gè)Survivor space當(dāng)前已使用的內(nèi)存大小 (kB).
- S1U: Young Generation第二個(gè)Survivor space當(dāng)前已經(jīng)使用的內(nèi)存大小 (kB).
- EC: Young Generation中eden space的內(nèi)存大小 (kB).
- EU: Young Generation中Eden space當(dāng)前已使用的內(nèi)存大小 (kB).
- OC: Old Generation的內(nèi)存大小 (kB).
- OU: Old Generation當(dāng)前已使用的內(nèi)存大小 (kB).
- MC: Permanent Generation的內(nèi)存大小 (kB)
- MU: Permanent Generation當(dāng)前已使用的內(nèi)存大小 (kB).
- YGC: 從啟動(dòng)到采樣時(shí)Young Generation GC的次數(shù)
- YGCT: 從啟動(dòng)到采樣時(shí)Young Generation GC所用的時(shí)間 (s).
- FGC: 從啟動(dòng)到采樣時(shí)Old Generation GC的次數(shù).
- FGCT: 從啟動(dòng)到采樣時(shí)Old Generation GC所用的時(shí)間 (s).
- GCT: 從啟動(dòng)到采樣時(shí)GC所用的總時(shí)間 (s).
原文:https://www.cnblogs.com/wu-wu/p/11923250.html
總結(jié)
以上是生活随笔為你收集整理的linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 密码算法的安全强度
- 下一篇: iOS8不能通过itms-service