1. 程式人生 > >一次JAVA專案撐爆伺服器CPU、記憶體的事故回憶

一次JAVA專案撐爆伺服器CPU、記憶體的事故回憶

之前使用springBoot做過一個運維專案,邏輯很簡單,使用執行緒池持續抓取資料放入ArrayList中,放入執行緒池中,執行緒中按照裝置id使用HashMap分組,然後監控目標各項資料,開發時使用單元測試沒什麼問題,放到測試伺服器上,每次開始都很正常,執行半個小時CPU和記憶體會突然暴增到100%,然後JVM堆疊記憶體溢位。連續好幾次都是這樣,開始以為是鎖加的位置不對,優化程式碼,優化鎖,結果還是沒有好轉。後來部門經理過來查出了病因:半個小時候的時候 抓取的資料會突然從幾百增長至一萬,而我使用的ArrayList去接收資料,然後使用HashMap進行分組,資料量小的時候沒什麼問題。資料量大的時候我因為初始化ArrayList、HashMap時沒有指定大小,使用了預設的10個大小和預設的0.75的擴充因子,而ArrayList擴充時是會建立新的陣列,複製之前的資料過來繼續新增資料,因為資料量的突然增長,這裡消耗時間會變長,並且因為執行緒中使用不安全的HashMap預設大小為10的,在頻繁擴充套件中然後線上程中出現了死鏈,從而造成CPU、記憶體暴增。知道問題後所以當時首先將hashMap改為執行緒安全map,同時給ArrayList,Map初始化時指定了合適的大小,再執行時問題解決