内存泄漏——如何查看

——如果有个梦想,就要捍卫它

首先需要知道三个词:GC(垃圾收集器)、内存溢出、内存泄漏。

内存溢出与内存泄漏

内存溢出(out of memory)

内存溢出是指当对象的内存占用已经超出分配内存的空间大小,这时未经处理的异常就会抛出。比如常见的内存溢出情况有:bitmap过大;引用没释放;资源对象没关闭
简单而言,内存溢出就是要求分配的内存超出了系统能给的,系统不能满足需求,于是产生溢出。
如图,这是常见的bitma对象的溢出,显示像素过高或图片尺寸远远大于显示空间的尺寸时,通常都要将其缩放,减小占用内存。

内存泄漏(memory leak)

1.由于我们程序的失误,长期保持某些资源(如Context)的引用,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成内存泄露。
2.保存了多个耗用内存过大的对象(如Bitmap)或加载单个超大的图片,造成内存超出限制。

重点:如何查看内存泄漏

第一步:

在Android Studio有个Android Monitor,点击Android Monitor后—–>Monitors

内存泄漏

第二步

强制GC:点击 Initate GC 内存泄漏按钮,建议点击后等待几秒后再次点击,多点几次,让GC更加充分。然后点击 Dump Java Heap 内存泄漏按钮,然后等到一段时间,生成有点慢。

内存泄漏
内存泄漏

会生成的Java Heap文件(.hprof)

内存泄漏

第三步

点击 Analyzer TasksPerform Analysis 按钮,然后,即可找出内存泄漏
内存泄漏

Analysis Results 即可查看Leaked情况

内存泄漏

内存泄漏

可以看到我写的工具类ToastUtil有内存泄漏,对象是mInstance

内存泄漏

深入查看

第四步

转换成标准的hprof文件
前几步生成的文件在Android Studio的哪里呢?
在Android Studio的左侧 Captures —–> Heap Snapshot文件夹里面

内存泄漏

保存hprof文件,

内存泄漏

选择路径,填写文件名:

内存泄漏

第五步

使用MAT工具查看
MAT工具地址:
http://www.eclipse.org/mat/downloads.php

内存泄漏

感谢以下各位大神写的文章:
(1)如何查看内存泄露:
1. http://www.cnblogs.com/taoweiji/p/5760537.html
2. http://blog.csdn.net/qq_27650777/article/details/51984006
3. https://www.2cto.com/kf/201512/455421.html
(2)Shallow Size、Retained Size、Heap Size的讲解:
3. http://blog.csdn.net/yincheng886337/article/details/50517375
4. http://blog.csdn.net/kingzone_2008/article/details/9083327
5. https://segmentfault.com/q/1010000008704481/a-1020000008707290
内存溢出与内存泄漏的讲解:
6. http://blog.csdn.net/sinat_29255093/article/details/52556760
7. http://www.importnew.com/12961.html

以下是我写的关于本文章的小项目:
https://github.com/Jys05/MemoryLeak_Test

相关文章: