91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

生產環境JVM內存溢出的示分析

發布時間:2021-10-23 15:59:11 來源:億速云 閱讀:141 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關生產環境JVM內存溢出的示分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

如果我們所在公司的業務量比較大,在生產環境經常會出現JVM內存溢出的現象,那我們該如何快速響應,快速定位,快速恢復問題呢?

通過一個線上環境JVM內存溢出的案例向大家介紹一下處理思路與分析方法。

案例:架構組接到某項目組反饋,Zabbix監控上顯示JMX不可用,請求協助處理。

分析思路:

  • JMX不可用,往往是由于垃圾回收時間停頓時間過長、內存溢出等問題引起的。

  • 線上故障分析的原則是首先要采取措施快速恢復故障對業務的影響,然后才是采集信息、分析定位問題,并最終給出解決辦法。

具體分析過程如下。

 

如何快速恢復業務

通常線上的故障會對業務造成重大影響,影響用戶體驗,故如果線上服務器出現故障,應規避對業務造成影響,但不能簡單的重啟服務器,因為需要盡可能保留現場,為后續的問題分析打下基礎。

那我們如何快速規避對業務的影響,并能保留現場呢?

通常的做法是隔離故障服務器。

通常線上服務器是集群部署,一個好的分布式負載方案會自動剔除故障的機器,從而實現高可用架構,但如果未被剔除,則需要運維人員將故障服務器進行剔除,保留現場進行分析。

發生內存泄露,通常情況下是由于代碼的原因造成的,一般無法立即對代碼進行修復,很容易會發送連鎖反應造成應用服務器一臺一臺接連宕機,故障面積會慢慢擴大,針對此種情況,應快速定位發生內存泄露的原因,將該服務進行降級,避免對其他服務造成影響。最簡單的降級方法是根據F5(Nginx)轉發策略,對該功能定向到一個單獨的集群,與其他流量進行隔離,確保其他業務不受牽連,給故障排查、解決提供寶貴的緩沖時間。

 

分析解決問題

首先可以通過查看日志,確定是哪種內存溢出,堆內存溢出可發生的地方:Java heap space(堆空間)、perm space(持久代)。

生產環境JVM內存溢出的示分析

 
收集內存溢出Dump文件

收集Dump文件有兩種方式:

  • 設置JVM啟動參數
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=/opt/jvmdump

在每次發生內存溢出時,JVM會自動將堆轉儲,dump文件存放在-XX:HeapDumpPath指定的路徑下。

  • 使用jmap命令收集
    通過jmap -dump:live,format=b,file=/opt/jvm/dump.hprof pid。

 
分析Dump文件

在獲取Dump文件后,可以使用工具MAT(MemoryAnalyzer)進行分析,該工具大家可以通過百度自行下載。

使用MAT打開Dump文件后,首頁截圖如下:

生產環境JVM內存溢出的示分析

工具按鈕介紹:

生產環境JVM內存溢出的示分析:直方圖視圖,將堆中所有的內存消耗情況統計出來,其如圖所示:

生產環境JVM內存溢出的示分析

生產環境JVM內存溢出的示分析:內存使用樹狀結構,以線程為維度,樹狀形式展開,如圖所示:

生產環境JVM內存溢出的示分析

生產環境JVM內存溢出的示分析線程棧,其截圖如下:

生產環境JVM內存溢出的示分析

生產環境JVM內存溢出的示分析

根據該圖,可以明確,堆的總大小為1.9G,被4個線程全部占據,導致其他線程無法再申請資源,拋出堆內存溢出錯誤。

接下來,我通常的做法是直接去看生產環境JVM內存溢出的示分析這個視圖(以線程為基本維度,查找線程中占用內存的對象),為后續定位排查提供必要的依據。

生產環境JVM內存溢出的示分析

生產環境JVM內存溢出的示分析

從上面的截圖中可以得出如下關鍵信息點:

  • org.apache.ibatis.executor.result.DefaultResultHandler內部持有一個List,其原始為java.util.HashMap,從這個類基本可以看出是與數據庫的查詢相關,對數據庫返回結果的解碼并組織成HashMap。

  • 這個List中的元素總共有146033個,初步可以判斷出是在一次查詢中從數據庫中一次查詢出了太多數據,造成了內存溢出。

由于SQL查詢代碼中,是用HashMap來接收數據庫中的返回字段,無法一時間看出是那個查詢,那我們能不能精確找到是哪一個查詢,哪一行代碼,甚至與哪一條SQL語句呢?

答案是可以的,我們可以從生產環境JVM內存溢出的示分析視圖一探究竟。

溫馨提示:
生產環境JVM內存溢出的示分析視圖使用技巧:展開技巧:沿著使用率最高的項一層一層進行展開,直至發現具體占用內存的對象。

接下來我們從 視圖去尋找是哪個方法,哪條SQL語句觸發的。

具體方法:首先完全展開一個線程,從展開圖的底部向上尋找:
其線程的入口(控制層代碼)

生產環境JVM內存溢出的示分析

繼續往上查找,要找到SQL語句,應該找到Mybatis處理結果集相關的類,如圖所示:

生產環境JVM內存溢出的示分析

然后展開boundSql即能找到SQL語句:

生產環境JVM內存溢出的示分析

然后鼠標可以放在SQL屬性中,右鍵,可以將SQL語句復制出來。

生產環境JVM內存溢出的示分析

由于這里涉及到公司的代碼機密,故在這里不貼出具體的SQL語句。

這里根據后面的分析,原來是在做導出功能的時候,沒有使用分頁對數據進行分頁查詢,分頁寫入Excel文件,而是一次將全部數據查詢,導致導出功能如果并發數超過4個時,就會將所有內存耗盡。

解決方案:

  • 首先在運維層面將該請求導入到指定的一臺服務器上,是導出任務與其他任務進行隔離,避免對其他重要服務造成影響。

  • 項目組對其代碼進行修復,可以使用分頁查數據,然后分配寫入Excel。

關于生產環境JVM內存溢出的示分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

jvm
AI

化州市| 勐海县| 阳谷县| 乌鲁木齐市| 泗洪县| 白水县| 阳城县| 股票| 元阳县| 区。| 介休市| 敦煌市| 鄄城县| 玛多县| 阿荣旗| 穆棱市| 九龙坡区| 精河县| 金华市| 蕲春县| 金昌市| 平阴县| 萍乡市| 曲阜市| 封丘县| 婺源县| 黄山市| 扶余县| 黑龙江省| 手游| 金川县| 沂源县| 英超| 长岛县| 清河县| 肃南| 石棉县| 成武县| 河间市| 泉州市| 临洮县|