1. 程式人生 > >記憶體洩露和記憶體溢位的區別 (概念區別 產生原因區別 及解決辦法) 個人整理

記憶體洩露和記憶體溢位的區別 (概念區別 產生原因區別 及解決辦法) 個人整理

記憶體洩露和記憶體溢位的區別

概念區別

記憶體溢位 : 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回收