記憶體洩露和記憶體溢位的區別 (概念區別 產生原因區別 及解決辦法) 個人整理
記憶體洩露和記憶體溢位的區別
概念區別
記憶體溢位 : out of memory 指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out fo memory 比如申請一個integer 但給它存了long才能存下的數那就是記憶體溢位
記憶體洩露 : memory leak 指程式在申請記憶體後,無法釋放已經申請的記憶體空間,一次記憶體洩露危害可以忽略,但記憶體洩露堆積後的結果很嚴重,無論多少記憶體,遲早會被佔光
即為:不再會被使用的物件的記憶體不能被回收,就是記憶體洩露
產生原因的區別
記憶體溢位產生的原因:
1. 記憶體中載入的資料量過於龐大,如一次從資料庫中取出過多的資料
2. 集合類中有對物件的引用,使用完後未清空
3. 程式碼中存在死迴圈或迴圈產生過多重複的實體物件
4. 使用的第三方軟體中的bug
5. 啟動引數記憶體值設定的過小
記憶體溢位的解決方案:
1. 修改JVM啟動引數,直接增加記憶體 (-Xms –Xms 引數一定不要忘記加)
2. 檢查錯誤日誌檢視 OutOfMemory 錯誤前是否有其他異常或錯誤
3. 對程式碼進行分步執行分析,找出可能發生溢位的位置
重點排查一下幾點:
1. 檢查是否一次獲取大量資料的查詢,一般來說,一次獲取十萬條以上的記錄到記憶體,就可能產生記憶體溢位.所以大家在開發的時候,需要考慮如果上線後需要獲取大量資料,增加預防次問題,對此建議查詢儘量使用分析查詢
2. 檢查程式碼是否有死迴圈或遞迴呼叫
3. 檢查是否有大量迴圈重複產生新物件實體
4. 檢查List Map等集合物件是否使用完後,未清除的問題,List Map等集合物件始終會有對物件的引用,這樣的物件便不會被GC回收