在 AS 上运行 MemoryBugs-master 项目,寻找潜在的内存问题。
1、 Leaks 显示出错误
sTextView被声明为静态变量,持有mContext上下文的引用,造成内存泄漏。
静态对象,在整个程序运行期间,是不会被垃圾回收的。
静态变量持有 另一非静态对象 的引用,导致这个非静态对象被销毁之后,也不能够被回收,导致内存泄漏 。
解决办法: sTextView取消 static 。
2、Allocation Tracking 检查
看到 MainActivity类中,创造了大量的 Rect, StringBuilder对象。
解决办法:尽量不要在for循环中新建对象。
Rect rect = new Rect(0, 0, 100, 100);
String s="-------: " + rect.width();
for (int i = 0; i < 10000; i++) {
System.out.println(s);
}
3、不要在onDraw()方法中新建对象
因为onDraw()调用频率很高,所以尽量不要在该方法中新建对象。
解决办法:在onDraw()方法外新建对象,变成全局变量使用。
private void initView() {
mRect = new RectF(0, 0, 100, 100);
mPaint = new Paint();
}
避免内存泄漏的方法
尽量不要让静态变量 引用Activity
使用 WeakReference
使用静态内部类来代替内部类
静态内部类使用 弱引用来 引用外部类
在声明周期结束的时候释放资源
减少内存使用
使用 更轻量的数据结构(比如SpareArray代替 HashMap)
避免在onDraw方法中创建对象。(该方法,频率很高)
对象池(Message.obtain()) (相当于对象缓冲)
LRUCache
Bitmap内存复用,压缩(inSampleSize, inBitmap)
StringBuilder
减少了内存使用,垃圾回收就会减少,内存抖动就会减少,使程序使用更加平滑,顺畅。