GeekBand 第十二周笔记
2016-07-30 11:17
190 查看
在 AS 上运行 MemoryBugs-master 项目,寻找潜在的内存问题。
1、 Leaks 显示出错误
![](https://img-blog.csdn.net/20160730092756788)
sTextView被声明为静态变量,持有mContext上下文的引用,造成内存泄漏。
静态对象,在整个程序运行期间,是不会被垃圾回收的。
静态变量持有 另一非静态对象 的引用,导致这个非静态对象被销毁之后,也不能够被回收,导致内存泄漏 。
解决办法: sTextView取消 static 。
2、Allocation Tracking 检查
![](https://img-blog.csdn.net/20160730110632114)
看到 MainActivity类中,创造了大量的 Rect, StringBuilder对象。
解决办法:尽量不要在for循环中新建对象。
3、不要在onDraw()方法中新建对象
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 减少了内存使用,垃圾回收就会减少,内存抖动就会减少,使程序使用更加平滑,顺畅。
相关文章推荐
- C++面向对象高级编程笔记03--GeekBand
- GeekBand-极客班-C++算法原理与实践-董飞-课程笔记(一)
- GeekBand笔记-《STL与泛型编程 》 第五周
- GeekBand笔记-《C++设计模式》第一周
- GeekBand笔记-《C++面向对象高级编程(上)》 第一周
- 20135316王剑桥 linux第十二周课实验笔记
- geekband_c++学习笔记1
- Linux 第十二周学习笔记 阿帕奇服务
- 机器学习-学习笔记 学习总结归纳(第十二周)
- GeekBand第十一周笔记
- 20135337——信息安全设计基础第十二周学习笔记
- C++面向对象高级编程笔记01--GeekBand
- 学习笔记 第十二周 第一篇
- GeekBand笔记-《C++面向对象高级编程(下)》 第二周
- GeekBand第十三周笔记
- GeekBand笔记-《STL与泛型编程 》 第二周
- GeekBand 第十四周笔记
- Geekband_C++面向对象高级编程_第六周学习笔记
- C++面向对象高级编程笔记02--GeekBand