Android Studio Profiler 检查内存简单介绍
如何使用?
第一步:点击Profiler按钮
第二步:选择
第三步:选择Capture heap dump 并点击Record
解释相关按钮的功能
-
垃圾桶按钮:用于强制执行垃圾回收事件的按钮,也就是GC。需要进行强制GC时可以点击。
-
Capture heap dump:抓取堆栈:(可以用来分析普通内存泄露问题)
-
Record native allocations:抓取原生内存(C/C++)分配
-
Record Java/Kotlin allcations:抓取Java/Kotlin 内存分配
-
Record:点击抓取一段时间的内存分配信息。
-
Others:应用使用的系统无法确定如何分类的内存。
-
Code:应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存。
-
Stack:应用中的原生堆栈和 Java 堆栈使用的内存。这通常与应用运行多少线程有关。
-
Graphics:图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。(请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。)
-
Native:从 C 或 C++ 代码分配的对象的内存。
即使应用中不使用 C++,即使编写的代码采用 Java 或 Kotlin 语言,Android 框架仍使用原生内存代表您处理各种任务,如处理图像资源和其他图形。
-
Java:从 Java 或 Kotlin 代码分配的对象的内存。
-
Allocated:应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象。
查看内存分配情况
选择Capture heap dump选项,点击Record。
Leaks:当存在泄露时,会提示相应的类,可以点击跳转。可以使用已分配对象列表上方的三个菜单选择需检查的堆以及如何组织数据。
选择需检查的堆:
-
image heap:系统启动映像,包含启动期间预加载的类。此处的分配确保绝不会移动或消失。
-
zygote heap:写时复制堆,其中的应用进程是从 Android 系统中派生的。
-
app heap:您的应用在其中分配内存的主堆。
选择如何安排分配
Arrange by class:根据类名称对所有分配进行分组。这是默认值。
Arrange by package:根据软件包名称对所有分配进行分组。
Arrange by callstack:将所有分配分组到其对应的调用堆栈。
选择如何安排分配
-
Show all classes:展示所有Class类(包括系统类),这是默认值。
-
Show activity/fragment Leaks:展示泄露的activity/fragment。
-
Show project class:展示项目的Class类。
-
Allocations:对象个数 , new一个对象就代表一个。如果出现多个 , 就要考虑是否有内存泄漏了。
-
Native Size:此对象类型使用的原生内存总量(以字节为单位)。只有在使用 Android 7.0 及更高版本时,才会看到此列。
-
您会在此处看到采用 Java 分配的某些对象的内存,因为 Android 对某些框架类(如 Bitmap)使用原生内存。
-
Shallow Size:此对象类型使用的 Java 内存总量(以字节为单位)。
-
Retained Size:为此类的所有实例而保留的内存总大小(以字节为单位)。
-
Depth:从任意 GC 根到选定实例的最短跳数。
分析问题关注:Allocations 与 Shallow Size
实战的泄露问题分析
NewMeFragment发生了内存泄露。
可以点击如图Show nearest GC root only 按钮,这时候就可以看到离他最近GC引用有两条。
private final ArrayList<Fragment> mFoldFragments = new ArrayList<>(4);
所以需要在合适的地方释放。