如果您正在编写原生代码并担心其内存使用情况,则对应用程序的原生分配进行分析非常有用,以便发现是否有优化机会。
为什么要分析应用程序内存
Android 提供了一个托管内存环境 - 当 Android 确定您的应用程序不再使用某些对象时,垃圾回收器会将未使用的内存释放回堆。Android 查找未使用的内存的方式一直在不断改进,但在所有 Android 版本上,系统必须在某个时候短暂暂停您的代码。大多数时候,暂停是无法察觉的。但是,如果您的应用程序分配内存的速度快于系统收集内存的速度,那么您的应用程序可能会在收集器释放足够的内存以满足您的分配之前被延迟。延迟可能会导致您的应用程序跳过帧,并导致明显的缓慢。
有关可减少应用程序内存使用的编程实践的信息,请阅读管理应用程序的内存.
原生分配概述
当你运行 **跟踪内存消耗(原生分配)** 任务时,Android Studio Profiler 会跟踪你在指定时间段内原生代码中对象的分配和释放,并提供以下信息。
- 分配:使用
malloc()
或new
运算符在所选时间段内分配的对象数量。 - 释放:使用
free()
或delete
运算符在所选时间段内释放的对象数量。 - 分配大小:在所选时间段内所有分配的总大小(以字节为单位)。
- 释放大小:在所选时间段内所有释放内存的总大小(以字节为单位)。
- 总计:**分配** 列中的值减去 **释放** 列中的值。
- 剩余大小:**分配大小** 列中的值减去 **释放大小** 列中的值。
可视化 选项卡显示了在所选时间范围内调用堆栈中与原生代码相关的所有对象的聚合视图。它实际上显示了调用堆栈中显示的实例占用了多少总内存。第一行显示线程名称。默认情况下,对象根据分配大小从左到右堆叠;使用下拉菜单更改排序方式。
默认情况下,Profiler 使用 2048 字节的样本大小:每分配 2048 字节内存,就会拍摄内存快照。较小的样本大小会导致更频繁的快照,从而产生关于内存使用情况的更准确数据。较大的样本大小会产生不太准确的数据,但它会消耗更少的系统资源并在记录时提高性能。要更改样本大小,请参阅 编辑录制配置。