您的位置:首页 > 其它

GeekBand 第十二周笔记

2016-07-30 11:17 190 查看
在 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

减少了内存使用,垃圾回收就会减少,内存抖动就会减少,使程序使用更加平滑,顺畅。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息