天天看點

GeekBand 第十二周筆記

在 AS 上運作 MemoryBugs-master 項目,尋找潛在的記憶體問題。

1、 Leaks 顯示出錯誤

GeekBand 第十二周筆記

sTextView被聲明為靜态變量,持有mContext上下文的引用,造成記憶體洩漏。

靜态對象,在整個程式運作期間,是不會被垃圾回收的。

靜态變量持有 另一非靜态對象 的引用,導緻這個非靜态對象被銷毀之後,也不能夠被回收,導緻記憶體洩漏 。

解決辦法: sTextView取消 static 。

2、Allocation Tracking 檢查

GeekBand 第十二周筆記

看到 MainActivity類中,創造了大量的 Rect, StringBuilder對象。

解決辦法:盡量不要在for循環中建立對象。

Rect rect = new Rect(, , , );
  String s="-------: " + rect.width();

  for (int i = ; i < ; i++) {
      System.out.println(s);
  }
           

3、不要在onDraw()方法中建立對象

因為onDraw()調用頻率很高,是以盡量不要在該方法中建立對象。

解決辦法:在onDraw()方法外建立對象,變成全局變量使用。
           
private void initView() {
        mRect = new RectF(, , , );
        mPaint = new Paint();
    }
           
避免記憶體洩漏的方法

        盡量不要讓靜态變量 引用Activity

        使用 WeakReference

        使用靜态内部類來代替内部類

        靜态内部類使用 弱引用來 引用外部類

        在聲明周期結束的時候釋放資源



    減少記憶體使用

        使用 更輕量的資料結構(比如SpareArray代替 HashMap)

         避免在onDraw方法中建立對象。(該方法,頻率很高)

         對象池(Message.obtain()) (相當于對象緩沖)

         LRUCache

         Bitmap記憶體複用,壓縮(inSampleSize, inBitmap)

         StringBuilder


    減少了記憶體使用,垃圾回收就會減少,記憶體抖動就會減少,使程式使用更加平滑,順暢。
           

繼續閱讀