1. 程式人生 > >JVM虛擬機器學習--記憶體洩漏和記憶體溢位

JVM虛擬機器學習--記憶體洩漏和記憶體溢位

記憶體洩漏memory leak :是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩漏似乎不會有大的影響,但記憶體洩漏堆積後的後果就是記憶體溢位。

記憶體溢位 out of memory :指程式申請記憶體時,沒有足夠的記憶體供申請者使用,或者說,給了你一塊儲存int型別資料的儲存空間,但是你卻儲存long型別的資料,那麼結果就是記憶體不夠用,此時就會報錯OOM,即所謂的記憶體溢位。

二者的關係:

1.記憶體洩漏的堆積最終會導致記憶體溢位。

2.記憶體溢位就是你要的記憶體空間超過了系統實際分配給你的空間,此時系統相當於沒法滿足你的需求,就會報記憶體溢位的錯誤。

3.記憶體洩漏是指你向系統申請分配記憶體進行使用(new),可是使用完了以後卻不歸還(delete),結果你申請到的那塊記憶體你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程式。就相當於你租了個帶鑰匙的櫃子,你存完東西之後把櫃子鎖上之後,把鑰匙丟了或者沒有將鑰匙還回去,那麼結果就是這個櫃子將無法供給任何人使用,也無法被垃圾回收器回收,因為找不到他的任何資訊。

4.記憶體溢位:一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉到地上不能吃了。這就是溢位。比方說棧,棧滿時再做進棧必定產生空間溢位,叫上溢,棧空時再做退棧也產生空間溢位,稱為下溢。就是分配的記憶體不足以放下資料項序列,稱為記憶體溢位。說白了就是我承受不了那麼多,那我就報錯。

記憶體溢位產生的原因:

1. 記憶體中載入的資料量過於龐大,如一次從資料庫中取出過多的資料

2. 集合類中有對物件的引用,使用完後未清空

3. 程式碼中存在死迴圈或迴圈產生過多重複的實體物件

4. 使用的第三方軟體中的bug

5. 啟動引數記憶體值設定的過小

記憶體溢位的解決方案:

1.  修改JVM啟動引數,直接增加記憶體 (-Xms –Xms 引數一定不要忘記加)

2.  檢查錯誤日誌檢視 OutOfMemory 錯誤前是否有其他異常或錯誤

3.  對程式碼進行分步執行分析,找出可能發生溢位的位置

重點排查一下幾點:

1.  檢查是否一次獲取大量資料的查詢,一般來說,一次獲取十萬條以上的記錄到記憶體,就可能產生記憶體溢位.所以大家在開發的時候,需要考慮如果上線後需要獲取大量資料,增加預防次問題,對此建議查詢儘量使用分析查詢

2.  檢查程式碼是否有死迴圈或遞迴呼叫

3.  檢查是否有大量迴圈重複產生新物件實體

4.  檢查List Map等集合物件是否使用完後,未清除的問題,List Map等集合物件始終會有對物件的引用,這樣的物件便不會被GC回收。

喜歡的朋友點個贊哦~~