内存泄漏——如何查看
——如果有个梦想,就要捍卫它
首先需要知道三个词: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 Tasks 的 Perform 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