一次jvm記憶體溢位問題排查

2021-10-17 18:40:49 字數 1238 閱讀 5485

首先看下問題原因:

上圖的意思是獲取直接記憶體失敗,然後jvm建議減少堆的大小,或者減小每個執行緒的大小,或者增加系統記憶體

觀察下執行緒的狀態:

目前總共產生了十三萬個執行緒池(**編寫存在問題,一般情況下不會有這麼多執行緒池),且統計了一下,存在十三萬的執行緒都處於阻塞狀態

開始使用jstack -l pid 觀察執行中的狀態:

目前的執行緒是阻塞狀態,且在等待乙個鎖

分析

從以上的狀態來看,高併發情況下,程式一直在重複的建立執行緒池並執行任務,但是每個執行緒都阻塞在乙個條件上了,不是高併發情況卻不會存在這個問題;

這種情況存在一種可能性:消費問題,由於系統瓶頸導致大量執行緒獲取不到鎖,從而阻塞;

結果:

由於linux系統對程序的同時開啟檔案數的限制,導致高併發情況下的檔案讀寫速度跟不上,引發了執行緒的積壓,適量增大系統的limit數量:

vim /etc/security/limits.conf

*                soft    nofile          65536

* hard nofile 65536

root soft nofile 327680

root hard nofile 327680

* soft nproc 327680

* hard nproc 327680

由於是老**,這裡存在乙個問題,這裡的執行緒使用是存在問題的,不應該建立那麼多的執行緒去執行任務,使用佇列加執行緒池的方式是最佳的解決辦法。如果存在任務積壓,可以通過拒絕策略指定處理方式,而不是需要排查堆疊日誌找問題;

參考資料

jvm崩潰日誌分析

jstack日誌分析

談論JVM記憶體溢位問題

1 問題描述 這兩天公司專案的專案進行測試,伺服器會偶爾出現訪問不通,ejb遠端呼叫全部失效的情況,經過對jvm監控,發現是jvm記憶體fullgc造成系統停頓造成的。目前基礎系統jboss啟動jvm記憶體設定為3g,之前出現過out of memory heap 的錯誤。現在正常開發情況下,基礎系...

jvm 記憶體溢位,引發溢位原因排查

jvm 記憶體溢位,引發溢位原因排查 一 dump檔案分析 dump檔案獲取方式 1 設定jvm引數 xx heapdumponoutofmemoryerror xx heapdumppath tmp heapdump.hprof 記憶體溢位時產生dump檔案 2 使用jmap生成dump 檔案 d...

記一次線上int溢位問題

今天吃完飯會辦公室,突然接到群裡的bug,線上預算資料出現了負值,如圖 於是一路奔回辦公室,各種分析日誌邏輯,分析了5個小時無果,因為印象中int的範圍是21億,而負值末尾是非零,因此一開始就否定了是int溢位的問題 後來還是其他小夥伴看到了 問題,原 如下 左邊是修改前的,右邊是修改後的 我的入參...