在 AS 上運作 MemoryBugs-master 項目,尋找潛在的記憶體問題。
1、 Leaks 顯示出錯誤
sTextView被聲明為靜态變量,持有mContext上下文的引用,造成記憶體洩漏。
靜态對象,在整個程式運作期間,是不會被垃圾回收的。
靜态變量持有 另一非靜态對象 的引用,導緻這個非靜态對象被銷毀之後,也不能夠被回收,導緻記憶體洩漏 。
解決辦法: sTextView取消 static 。
2、Allocation Tracking 檢查
看到 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
減少了記憶體使用,垃圾回收就會減少,記憶體抖動就會減少,使程式使用更加平滑,順暢。