當應用系統出現卡頓或者應用程序響應速度非常慢的時候,我們需要登錄到應用所在主機進行查看、分析問題原因。
使用${JAVA_HOME}/bin/jstat -gcutil PID 1000 10查看占用CPU資源較高的進程GC情況;
使用命令:top
可以看到PID為4267,USER為dform的進程CPU使用率高達1464.2%(即消耗當前主機14.64個CPU),嚴重超高。使用命令cat/proc/cpuinfo | grep processor |wc –l 可查看當前主機邏輯CPU個數。
使用命令:top-p 4267-H
紅框標出的10幾個線程耗用CPU都接近或者超過了100%(即該進程下有10幾個線程耗用CPU都高達1個左右)。
使用命令:
連續導出多個線程棧(stack)快照文件,每次導出間隔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,轉換之后的十六進制nid為117d
printf "%x "4477
(2)線程PID4542,轉換之后的十六進制nid為11be
(1)根據nid=0x117d查找到正在運行的程序代碼模塊,紅框標出是該線程最后正在做的事物(線程執行順序要從下向上看),綠框標出是應用側代碼模塊。
(2)同理,根據nid=0x11be查找到正在運行的程序代碼模塊
最后將上述分析結果和線程棧(stack)快照文件一并反饋給應用側核查和處理。
導致Java進程頻繁FULLGC的原因有:
(1)應用代碼邏輯設計不合理,對象創建太多,而且對象使用完后未及時釋放資源,或者已不再有用的對象相互之間存在引用,導致該對象無法進行回收;
(2)消費者消費速度慢(或停止消費),而生產者不斷往隊列中投遞任務,導致隊列中任務累積過多,任務對象占用堆內存太多而產生FULLGC;
(3)應用進程創建線程太多(每個線程需要分配線程棧內存),也可能導致內存溢出OOM,觸發FULLGC;
注:分析FULLGC的問題,除了要分析案例1中的線程棧(stack)快照信息外,還要導出JVM堆(heap)進行分析。
${JAVA_HOME}/bin/jmapdump:live,format=b,file=17074.hprof17074
注:堆(heap)快照文件一般都比較大,有幾個G大?。ɑ竞蛥?Xmx設置大小一致)。
通過對堆內存快照文件17074.hprof的分析,發現有以下一些對象占用內存較多:
結合日志信息分析,應用一次性經過代理節點從數據節點中獲取大量數據到堆內存中,并同時幾條請求同時進行,該代理節點出現JVM堆內數據占用較大導致內存溢出,FULLGC無法回收,此后一直頻繁FullGC。另根據GC信息分析,大約7個小時就會有一次較多請求刷新導致內存占用過多的情況。
最后將分析結果反饋給應用側核查和處理。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130177.html
摘要:線程僅僅被視為一個與其他進程共享某些資源的進程。穩定性可創建的線程的數量上存在限制,包括的啟動參數操作系統對線程的限制,如果超出這些限制,很可能會拋出異常。若是密集型程序產生大量的線程切換,將會降低系統的吞吐量。 OS中的進程、線程 進程:即處于執行期的程序,且包含其他資源,如打開的文件、掛起的信號、內核內部數據、處理器狀態、內核地址空間、一個或多個執行的線程、數據段。 線程:進程中...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20