當(dāng)應(yīng)用系統(tǒng)出現(xiàn)卡頓或者應(yīng)用程序響應(yīng)速度非常慢的時候,我們需要登錄到應(yīng)用所在主機(jī)進(jìn)行查看、分析問題原因。
使用${JAVA_HOME}/bin/jstat -gcutil PID 1000 10查看占用CPU資源較高的進(jìn)程GC情況;
使用命令:top
可以看到PID為4267,USER為dform的進(jìn)程CPU使用率高達(dá)1464.2%(即消耗當(dāng)前主機(jī)14.64個CPU),嚴(yán)重超高。使用命令cat/proc/cpuinfo | grep processor |wc –l 可查看當(dāng)前主機(jī)邏輯CPU個數(shù)。
使用命令:top-p 4267-H
紅框標(biāo)出的10幾個線程耗用CPU都接近或者超過了100%(即該進(jìn)程下有10幾個線程耗用CPU都高達(dá)1個左右)。
使用命令:
連續(xù)導(dǎo)出多個線程棧(stack)快照文件,每次導(dǎo)出間隔5s-10s
${JAVA_HOME}/bin/jstack4267 > stack_4267_1.log
${JAVA_HOME}/bin/jstack4267 > stack_4267_2.log
${JAVA_HOME}/bin/jstack4267 > stack_4267_3.log
使用命令:我們選取如下兩個線程為例
(1)線程PID4477,轉(zhuǎn)換之后的十六進(jìn)制nid為117d
printf "%x "4477
(2)線程PID4542,轉(zhuǎn)換之后的十六進(jìn)制nid為11be
(1)根據(jù)nid=0x117d查找到正在運(yùn)行的程序代碼模塊,紅框標(biāo)出是該線程最后正在做的事物(線程執(zhí)行順序要從下向上看),綠框標(biāo)出是應(yīng)用側(cè)代碼模塊。
(2)同理,根據(jù)nid=0x11be查找到正在運(yùn)行的程序代碼模塊
最后將上述分析結(jié)果和線程棧(stack)快照文件一并反饋給應(yīng)用側(cè)核查和處理。
導(dǎo)致Java進(jìn)程頻繁FULLGC的原因有:
(1)應(yīng)用代碼邏輯設(shè)計不合理,對象創(chuàng)建太多,而且對象使用完后未及時釋放資源,或者已不再有用的對象相互之間存在引用,導(dǎo)致該對象無法進(jìn)行回收;
(2)消費(fèi)者消費(fèi)速度慢(或停止消費(fèi)),而生產(chǎn)者不斷往隊列中投遞任務(wù),導(dǎo)致隊列中任務(wù)累積過多,任務(wù)對象占用堆內(nèi)存太多而產(chǎn)生FULLGC;
(3)應(yīng)用進(jìn)程創(chuàng)建線程太多(每個線程需要分配線程棧內(nèi)存),也可能導(dǎo)致內(nèi)存溢出OOM,觸發(fā)FULLGC;
注:分析FULLGC的問題,除了要分析案例1中的線程棧(stack)快照信息外,還要導(dǎo)出JVM堆(heap)進(jìn)行分析。
${JAVA_HOME}/bin/jmapdump:live,format=b,file=17074.hprof17074
注:堆(heap)快照文件一般都比較大,有幾個G大?。ɑ竞蛥?shù)-Xmx設(shè)置大小一致)。
通過對堆內(nèi)存快照文件17074.hprof的分析,發(fā)現(xiàn)有以下一些對象占用內(nèi)存較多:
結(jié)合日志信息分析,應(yīng)用一次性經(jīng)過代理節(jié)點從數(shù)據(jù)節(jié)點中獲取大量數(shù)據(jù)到堆內(nèi)存中,并同時幾條請求同時進(jìn)行,該代理節(jié)點出現(xiàn)JVM堆內(nèi)數(shù)據(jù)占用較大導(dǎo)致內(nèi)存溢出,F(xiàn)ULLGC無法回收,此后一直頻繁FullGC。另根據(jù)GC信息分析,大約7個小時就會有一次較多請求刷新導(dǎo)致內(nèi)存占用過多的情況。
最后將分析結(jié)果反饋給應(yīng)用側(cè)核查和處理。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/130177.html
摘要:虛擬化技術(shù)是業(yè)務(wù)發(fā)展到一定階段,互聯(lián)網(wǎng)企業(yè)必然會使用的技術(shù)。混部當(dāng)然也有一些問題,例如同一臺物理機(jī)上應(yīng)用被應(yīng)用突來的高峰所影響,周期被搶光,莫名其妙的負(fù)載升高?;觳坑袝r也不是一開始就能規(guī)劃好的,最好能動態(tài)調(diào)整,這樣就能通過虛擬化技術(shù)來做。 showImg(https://segmentfault.com/img/bVu8fH);虛擬化技術(shù)是業(yè)務(wù)發(fā)展到一定階段,互聯(lián)網(wǎng)企業(yè)必然會使用的技術(shù)...
摘要:線程僅僅被視為一個與其他進(jìn)程共享某些資源的進(jìn)程。穩(wěn)定性可創(chuàng)建的線程的數(shù)量上存在限制,包括的啟動參數(shù)操作系統(tǒng)對線程的限制,如果超出這些限制,很可能會拋出異常。若是密集型程序產(chǎn)生大量的線程切換,將會降低系統(tǒng)的吞吐量。 OS中的進(jìn)程、線程 進(jìn)程:即處于執(zhí)行期的程序,且包含其他資源,如打開的文件、掛起的信號、內(nèi)核內(nèi)部數(shù)據(jù)、處理器狀態(tài)、內(nèi)核地址空間、一個或多個執(zhí)行的線程、數(shù)據(jù)段。 線程:進(jìn)程中...
閱讀 1356·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3671·2023-01-11 13:20