new ArrayList 不當(dāng)導(dǎo)致 CPU 飆升。。
往期熱門(mén)文章:
1、假如Linus在中國(guó)··· 2、通過(guò) Arthas Trace 命令將接口性能優(yōu)化十倍 3、一個(gè)由“ YYYY-MM-dd ”引發(fā)的慘案 4、不要只盯著大廠,這20家中小廠我建議你也試試 5、百萬(wàn)數(shù)據(jù)excel導(dǎo)出功能如何實(shí)現(xiàn)?
目錄
前言
當(dāng)時(shí)場(chǎng)景
具體分析
結(jié)束語(yǔ)
前言
昨天線上容器突然cpu飆升,也是第一次排查這種問(wèn)題所以記錄一下~
當(dāng)時(shí)場(chǎng)景
1.正常的jvm監(jiān)控曲線圖
2.產(chǎn)生問(wèn)題的jvm監(jiān)控曲線圖
具體分析
-
進(jìn)入pod之后,輸入top查看各linux進(jìn)程對(duì)系統(tǒng)資源的使用情況(因我這是事后補(bǔ)稿,資源使用不高,大家看步驟即可)
-
分析資源使用情況在當(dāng)時(shí)的情況下,
當(dāng)時(shí)我的pid為1的進(jìn)程cpu上到了130(多核)那我認(rèn)定就是java應(yīng)用出問(wèn)題了,control+c退出繼續(xù)往下走
-
輸入top -H -p pid 通過(guò)此命令可以查看實(shí)際占用CPU最高的的線程的id,pid為剛才資源使用高的pid號(hào)
-
出現(xiàn)具體線程的資源使用情況,表格里的pid代表線程的id,我們稱(chēng)他為tid
-
我記得當(dāng)時(shí)的tip為746(上述圖片只是我給大家重復(fù)步驟),使用命令printf "%x\n" 746,將線程tid轉(zhuǎn)換為16進(jìn)制,
因?yàn)槲覀兙€程id號(hào)在堆棧里是16進(jìn)制的所以需要做一個(gè)進(jìn)制轉(zhuǎn)換
-
輸入jstack pid | grep 2ea >gc.stack
解釋一下,jstack是jdk給提供的監(jiān)控調(diào)優(yōu)小工具之一,jstack會(huì)生成JVM當(dāng)前時(shí)刻的線程快照,然后我們可以通過(guò)它查看某個(gè)Java進(jìn)程內(nèi)的線程堆棧信息,之后我們把堆棧信息通過(guò)管道收集2ea線程的信息,然后將信息生成為gc.stack文件,我隨便起的,隨意
-
當(dāng)時(shí)我先cat gc.stack 發(fā)現(xiàn)數(shù)據(jù)有點(diǎn)多在容器里看不方便,于是我下載到本地瀏覽,因?yàn)楣緦?duì)各個(gè)機(jī)器的訪問(wèn)做了限制,我只能用跳板機(jī)先找到一臺(tái)沒(méi)用的機(jī)器a,把文件下載到a然后我再把a(bǔ)里的文件下載到本地(本地訪問(wèn)跳板機(jī)OK),先輸入python -m SimpleHTTPServer 8080,linux自帶python,這個(gè)是開(kāi)啟一個(gè)簡(jiǎn)單http服務(wù)供外界訪問(wèn),
然后登錄跳板機(jī),使用curl下載curl -o http://ip地址/gcInfo.stack 為方便演示,我在圖中把ip換了一個(gè)假的
之后用同樣的方法從本地下載跳板機(jī)就可以了,記得關(guān)閉python開(kāi)啟的建議服務(wù)嗷
-
把文件下載到了本地,打開(kāi)查看編輯器搜索2ea,找到nid為2ea的堆棧信息,
之后找到對(duì)應(yīng)的impl根據(jù)行數(shù)分析程序
-
發(fā)現(xiàn)是在文件異步導(dǎo)出excel的時(shí)候,導(dǎo)出接口使用了公共列表查詢(xún)接口,列表接口查詢(xún)數(shù)據(jù)最多為分頁(yè)200一批,而導(dǎo)出數(shù)據(jù)量每個(gè)人的權(quán)限幾萬(wàn)到十幾萬(wàn)不等
并且該判斷方法使用了嵌套循環(huán)里判斷,且結(jié)合業(yè)務(wù)很容易get不到value,guawa下的newArrayList就是返回一個(gè)newArrayList(好像不用說(shuō)這么細(xì) (;一_一 ),在整個(gè)方法結(jié)束之前,產(chǎn)生的lists生命周期還在所以發(fā)生多次gc觸發(fā)重啟之后還影響到了別的pod。然后對(duì)代碼進(jìn)行了fix,緊急上線,問(wèn)題解決~
結(jié)束語(yǔ)
往期熱門(mén)文章:
1、為什么 Spring和IDEA 都不推薦使用 @Autowired 注解 2、公司新來(lái)一個(gè)同事:為什么 HashMap 不能一邊遍歷一邊刪除?一下子把我問(wèn)懵了! 3、緩存沒(méi)預(yù)熱,翻車(chē)了! 4、Java反射和new效率對(duì)比,差距有多大? 5、Java14 處理 NullPointerException 新方式,真的太香了! 6、40 個(gè) SpringBoot 常用注解:讓生產(chǎn)力爆表! 7、優(yōu)秀開(kāi)源軟件的類(lèi),都是怎么命名的? 8、宇宙第一 IDE 放棄了 Mac。。。 9、當(dāng)年很流行,現(xiàn)在已經(jīng)淘汰的Java技術(shù),請(qǐng)不要在繼續(xù)學(xué)了?。?! 10、如何正確使用 ThreadLocal,你真的用對(duì)了嗎?
評(píng)論
圖片
表情
