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