1.記憶體中載入的資料量過於龐大,如一次從資料庫取出過多資料;
2.集合類中有對物件的引用,使用完後未清空,使得jvm不能**;
3.**中存在死迴圈或迴圈產生過多重複的物件實體;
4.使用的第三方軟體中的bug;
5.啟動引數記憶體值設定的過小
解決方案:
第一步,修改jvm啟動引數,直接增加記憶體。(-xms,-xmx引數一定不要忘記加。)
第二步,檢查錯誤日誌,檢視「outofmemory」錯誤前是否有其它異常或錯誤。
第三步,對**進行走查和分析,找出可能發生記憶體溢位的位置。 重點排查以下幾點:
1.檢查對資料庫查詢中,是否有一次獲得全部資料的查詢。一般來說,如果一次取十萬條記錄到記憶體,就可能引起內 存溢位。這個問題比較隱蔽,在上線前,資料庫中資料較少,不容易出問題,上線後,資料庫中資料多了,一次查 詢就有可能引起記憶體溢位。因此對於資料庫查詢盡量採用分頁的方式查詢。
2.檢查**中是否有死迴圈或遞迴呼叫。
3.檢查是否有大迴圈重複產生新物件實體。
4.檢查對資料庫查詢中,是否有一次獲得全部資料的查詢。一般來說,如果一次取十萬條記錄到記憶體,就可能引起內 存溢位。這個問題比較隱蔽,在上線前,資料庫中資料較少,不容易出問題,上線後,資料庫中資料多了,一次查 詢就有可能引起記憶體溢位。因此對於資料庫查詢盡量採用分頁的方式查詢。
5.檢查list、map等集合物件是否有使用完後,未清除的問題。list、map等集合物件會始終存有對物件的引用,使 得這些物件不能被gc**。 第四步,使用記憶體檢視工具動態檢視記憶體使用情況
記憶體洩漏以及常見的解決方法
之所以撰寫這篇文章是因為前段時間花費了很大的精力在已經成熟的 上再去處理memory leak問題。寫此的目的是希望我們應該養成良好的編碼習慣,盡可能的避免這樣的問題,因為當你對著一大片的 再去處理此類的問題,此時無疑增加了解決的成本和難度。準確的說屬於補救措施了。指由於疏忽或錯誤造成程式未能釋放已...
android程式記憶體洩漏的原因和解決辦法
記憶體洩漏也稱作 儲存滲漏 用 動態儲存 分配函式動態開闢的空間,在使用完畢後未釋放,結果導致一直佔據該記憶體單元。直到程式結束。即所謂記憶體洩漏。記憶體洩漏簡單地說就是申請了一塊記憶體空間,使用完畢後沒有釋放掉。它的一般表現方式是程式執行時間越長,占用記憶體越多,最終用盡全部記憶體,整個 系統崩潰...
WebView記憶體洩漏解決方法
webview記憶體洩漏解決方法前言 在專案的開發過程中,由於對記憶體要求較高,最近對應用的記憶體分析比較在意,前段時間監控記憶體,對bitmap造成的記憶體洩漏進行了分析,並解決了問題。但是在記憶體洩漏之後,發現在訪問網頁的時候,webview竟然也會有記憶體洩漏,雖然記憶體占用很小,但是使用者多...