Java進(jìn)程cpu占用過(guò)高問(wèn)題解決
cpu是時(shí)分(time division)的,操作系統(tǒng)里有很多線(xiàn)程,每個(gè)線(xiàn)程的運(yùn)行時(shí)間由cpu決定,cpu會(huì)分給每個(gè)線(xiàn)程一個(gè)時(shí)間片,時(shí)間片是一個(gè)很短的時(shí)間長(zhǎng)度,如果在時(shí)間片內(nèi),線(xiàn)程一直占有,則是100%;我們應(yīng)該意識(shí)到,cpu運(yùn)行速度很快(主頻非常高),除非密集型耗費(fèi)cpu的運(yùn)算,其它類(lèi)型任務(wù)都會(huì)在小于時(shí)間片的時(shí)間內(nèi)結(jié)束。
產(chǎn)生CPU100%的原因:
某一程序一直占用CPU是導(dǎo)致CPU100%的原因,大概有以下幾種情況:
1、Java 內(nèi)存不夠或溢出導(dǎo)致GC overhead問(wèn)題, GC overhead 導(dǎo)致的CPU 100%問(wèn)題;
2、死循環(huán)問(wèn)題. 如常見(jiàn)的HashMap被多個(gè)線(xiàn)程并發(fā)使用導(dǎo)致的死循環(huán), 或者死循環(huán);
3、某些操作一直占用CPU
第一步:使用top命令,查看占用cpu的進(jìn)程
[root@sdfsdfseZ codeimage]# top
第二步:ps -ef | grep java 或jps命令,找出服務(wù)器的所有java進(jìn)程
第三步:找出CPU耗用最厲害的進(jìn)程pid
第四步:查找出具體占用cpu利用率最厲害的線(xiàn)程號(hào),top -H -p pid 。然后按下shift+p,跳出CPU監(jiān)控
當(dāng)前線(xiàn)程號(hào)為:1747
第五步:將獲取到的線(xiàn)程號(hào)轉(zhuǎn)換成16進(jìn)制
因?yàn)閖ava線(xiàn)程棧文件中的線(xiàn)程id是十六進(jìn)制,需要將線(xiàn)程id從十進(jìn)制轉(zhuǎn)為十六進(jìn)制。十進(jìn)制 轉(zhuǎn)十六進(jìn)制的命令如下:
結(jié)果為:
第六步:導(dǎo)出線(xiàn)程棧
將具體的占用CPU過(guò)高的java進(jìn)程的線(xiàn)程棧導(dǎo)出,導(dǎo)出命令如下:
pid.tdump文件后綴名隨意,通常以tdump結(jié)尾。
[root@sdfsdfsdeZ codeimage]# jstack 1747 > tmp/1747.tdump
可能會(huì)拋出異常;
1747: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
原因分析
jvm運(yùn)行時(shí)會(huì)生成一個(gè)目錄hsperfdata_$USER($USER是啟動(dòng)java進(jìn)程的用戶(hù)),在linux中默認(rèn)是/tmp,目錄下會(huì)有些pid文件,存放jvm進(jìn)程信息,而jmap,jstack等工具會(huì)讀取/tmp/hsperfdata_$USER下的pid文件獲取連接信息.
檢查了/tmp/hsperfdata_root目,,但在$TOMCAT_HOME目錄中的temp目錄中有對(duì)應(yīng)的文件.
解決辦法
使用
[root@iZ2zeab8t820b5ywp0rkfeZ bin]# jstack 1706 > /tmp/hsperfdata_root/1706.tdump
第七步:導(dǎo)出堆
[root@sddsdfsaZ bin]# jstat -gcutil 1706
第八步:jvisualvm分析快照使用JAVA_HOME/bin/jvisualvm.exe,載入快照
文件----->載入—>文件類(lèi)型(Dump)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何定位java程序中占用cpu最高的線(xiàn)程堆棧信息
這篇文章主要介紹了如何定位java程序中占用cpu最高的線(xiàn)程堆棧信息方法的相關(guān)資料,需要的朋友可以參考下2022-11-11SpringCloud Alibaba Nacos 整合SpringBoot A
這篇文章主要介紹了SpringCloud Alibaba Nacos 整合SpringBoot Admin實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12java 實(shí)現(xiàn)定時(shí)的方法及實(shí)例代碼
這篇文章主要介紹了java 定時(shí)任務(wù)詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03IDEA配置java開(kāi)發(fā)環(huán)境(maven、gradle、tomcat)
這篇文章主要介紹了IDEA配置java開(kāi)發(fā)環(huán)境(maven、gradle、tomcat),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09JAVA過(guò)濾器和攔截器有什么區(qū)別詳細(xì)講解
在JavaWeb開(kāi)發(fā)中,過(guò)濾器(Filter)和攔截器(Interceptor)是兩種重要的組件,主要用于攔截和處理請(qǐng)求,過(guò)濾器屬于JavaServlet規(guī)范,用于請(qǐng)求到達(dá)目標(biāo)資源之前或響應(yīng)返回客戶(hù)端之前的處理,需要的朋友可以參考下2024-10-10java連接mysql數(shù)據(jù)庫(kù)的方法
這篇文章主要為大家詳細(xì)介紹了java連接mysql數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Java利用Dijkstra算法求解拓?fù)潢P(guān)系最短路徑
迪杰斯特拉算法(Dijkstra)是由荷蘭計(jì)算機(jī)科學(xué)迪家迪杰斯特拉于1959年提出的,因此又叫狄克斯特拉算法。本文將利用迪克斯特拉(Dijkstra)算法求拓?fù)潢P(guān)系最短路徑,感興趣的可以了解一下2022-07-07