Android内存检测工具
什么是内存泄漏?
在运行的程序中,如果一个无法访问的对象仍然占用着内存空间,即为此对象造成了内存泄漏
垃圾回收(GC)机制:
当垃圾回收运行时,虚拟机首先会识别GC Root。GC Root 是一个可以从堆外部访问的对象,它可以是本地变量或运行中的线程等。虚拟机会识别所有可以从GC Root访问的对象,它们将会被保留,而其他无法从GC Root访问的对象,则会被认为垃圾并回收掉。
一、通过Memory Profiler检测内存泄漏
打开 Memory Profiler,选中MEMORY ,进入MEMORY视图,
点击下图所示按钮,保存Heap Dump:
1.1、Activity 和 Fragment 内存泄漏检测
Heap Dump 加载完成后,勾选 “Activity/Fragment Leaks” 选框:
此时如果有检查到 Activity 或 Fragment 的泄漏,就会在界面中显示出来:
1.2、通过包名筛选来查看APP内其他内存泄漏的地方
选择Arrange by package :选择对应包名,查看可能存在内存泄漏的地方 ① :选择包名筛选 ② :点击LeakTestActivity$1 查看LeakedActivity内存泄漏的地方 ③ :右键,跳转到发生内存泄漏源码的地方1.3、通过观察 MEMORY 内存图标趋势判断是否发生内存泄漏
可以通过横竖屏切换,或者多执行几次可能发生内存泄漏的代码,通过观察MEMORY 轨迹趋势,如果内存走向是增加的,则肯定发生了内存泄漏,如下图:
查看堆和内存分配: https://developer.android.com/studio/profile/memory-profiler?utm_source=android-studio#capture-heap-dump二、HeapView 使用
启动:Sdk/tools/monitor 启动Monitor。端口冲突的话可以先关闭AS
A:打开DDMS视图,
B:选择Heap窗口
C:选择对应包名,点击Heap 按钮
D:点击Heap按钮
E:Cause GC 更新数据
列名 | 意义 |
---|---|
Heap Size | 堆栈分配给App的内存大小 |
Allocated | 已分配使用的内存大小 |
Free | 空闲的内存大小 |
%Used | Allocated/Heap Size,使用率 |
Objects | 对象数量 |
内存详情
类型 | 意义 |
---|---|
free | 空闲的对象 |
data object | 数据对象,类类型对象,最主要的观察对象 |
class object | 类类型的引用对象 |
1-byte array(byte[],boolean[]) | 一个字节的数组对象 |
non-Java object | 非Java对象 |
每一列含义:
列名 | 意义 |
---|---|
Count | 数量 |
Total Size | 总共占用的内存大小 |
Smallest | 将对象占用内存的大小从小往大排,排在第一个的对象占用内存大小 |
Largest | 将对象占用内存的大小从小往大排,排在最后一个的对象占用的内存大小 |
Median | 将对象占用内存的大小从小往大排,拍在中间的对象占用的内存大小 |
Average | 平均值 |
点击data object行时,可以看到如下的柱状图
横坐标是对象的内存大小,这些值随着不同对象是不同的,纵坐标是在某个内存大小上的对象的数量
2.1 HeapView使用场景:
Heap Viewer中的数值会自动在每次发生GC时会自动更新。
2.2 内存泄漏检查
在需要检测的用例执行后,手动点击 按钮,触发GC,然后观察 data object 一栏的 Total Size (也可以观察Heap Size/Allocated内存的情况) ,看看内存会不会恢复到一个稳定的值,多次操作后,只要这个值稳定,说明没有内存泄漏。
如果每次GC后值都在增长,则说明有内存泄漏的可能性
2.3 内存抖动检查
内存抖动会伴随着频繁的GC。只需要开启Heap View,观察数据就行了。
如果发生内存抖动,会发现数据在短时间内频繁更新
此部分参考:https://blog.csdn.net/zhangfei2018/article/details/49154479
三、LeakCanary检查内存泄漏
添加依赖:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4'
releaseImplementation'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
Application中初始化:
这样就能检测Activity的内存泄漏了,当然Fragment或者其他的内存泄漏是检测不到的。
如果需要检查Fragment内存泄漏,需要使用RefWatcher
来监控,修改如下:
在Application中提供一个全局的RefWatcher 对象,然后在Fragment调用如下:
更多内存分析方式:
dump文件分析、MAT分析
崩溃检测
Monkey 检测ANR和Crash
推荐阅读
-
Android 和 Java 内存泄露检测工具——LeakCanary
-
共享内存系统是普通单机程序开发人员熟悉的开发范式 博客分类: Java互联网 工程现代模型一致性副本
-
Android build问题记录
-
监测命令(jvisualvm jps jstat jmap jhat jstack jinfo)及dump堆内存快照分析
-
Building TensorFlow on Android so Easy
-
golang pprof 性能检测工具使用
-
Android内存检测工具
-
Android内存泄漏检测工具
-
java中比较有难度的栈和堆 博客分类: Java java内存变量数组商城
-
java中比较有难度的栈和堆 博客分类: Java java内存变量数组商城