首先看下問題原因:
上圖的意思是獲取直接記憶體失敗,然後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溢位的問題 後來還是其他小夥伴看到了 問題,原 如下 左邊是修改前的,右邊是修改後的 我的入參...