1. 程式人生 > >記憶體溢位,記憶體洩漏,記憶體抖動

記憶體溢位,記憶體洩漏,記憶體抖動

記憶體溢位,記憶體洩漏,記憶體抖動你都碰到過嗎?怎麼解決的?如何區分這幾種情況?怎麼解決由記憶體洩漏而導致的記憶體溢位?

記憶體優化 . 記憶體洩露 記憶體溢位 記憶體抖動 分析與解決

記憶體溢位和記憶體洩漏的區別、產生原因以及解決方案

一、記憶體溢位:

(一)、定義:

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢位。

(二)、引起記憶體溢位的原因以及解決方案:

原因:

1.記憶體中載入的資料量過於龐大,如一次從資料庫取出過多資料;
2.集合類中有對物件的引用,使用完後未清空,使得JVM不能回收;
3.程式碼中存在死迴圈或迴圈產生過多重複的物件實體;
4.使用的第三方軟體中的BUG;
5.啟動引數記憶體值設定的過小

解決方案:

第一步,修改JVM啟動引數,直接增加記憶體。(-Xms,-Xmx引數一定不要忘記加。)
第二步,檢查錯誤日誌,檢視“OutOfMemory”錯誤前是否有其它異常或錯誤。
第三步,對程式碼進行走查和分析,找出可能發生記憶體溢位的位置。

(三)、如何區分:

報錯:提示“out of memory”。

二、記憶體洩漏:

(一)、定義:

記憶體洩露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩露危害可以忽略,但記憶體洩露堆積後果很嚴重,無論多少記憶體,遲早會被佔光。

(二)、引起記憶體洩漏的原因以及解決方案:

Android如何有效地解決記憶體洩漏

引起記憶體洩漏的場景:

  • 資源物件沒關閉造成的記憶體洩漏,如查詢資料庫後沒有關閉遊標cursor
  • 構造Adapter時,沒有使用 convertView 重用
  • 物件被生命週期長的物件引用,如activity被靜態集合引用導致activity不能釋放
  • Bitmap物件不再使用時,沒有呼叫recycle()釋放記憶體(?存在疑問)

(三)、如何區分:

記憶體洩露, 觀察 momory monitor 出現,記憶體不斷增加 記憶體不斷增加情況 然後降低.
工具使用:通過 heap viewer 檢視

三、記憶體抖動:

(一)、定義:

記憶體抖動是指在短時間內有大量的物件被建立或者被回收的現象,記憶體抖動出現原因主要是頻繁(很重要)在迴圈裡建立物件。

(二)、引起記憶體抖動的原因以及解決方案:

記憶體抖動出現原因主要是頻繁(很重要)在迴圈裡建立物件,導致大量物件在短時間內被建立,由於新物件是要佔用記憶體空間的而且是頻繁,如果一次或者兩次在迴圈裡建立物件對記憶體影響不大,不會造成嚴重記憶體抖動這樣可以接受也不可避免,頻繁的話就很記憶體抖動很嚴重。記憶體抖動的影響是如果抖動很頻繁,會導致垃圾回收機制頻繁執行(短時間內產生大量物件,需要大量記憶體,而且還是頻繁抖動,就可能會需要回收記憶體以用於產生物件,垃圾回收機制就自然會頻繁運行了)。綜上就是頻繁記憶體抖動會導致垃圾回收頻繁執行。

(三)、如何區分:

記憶體抖動: 通過momory monitor 發現 出現記憶體忽上忽下 形成針尖狀的情況.