
如上图所示,内存分析器的默认视图包括以下内容:
① 强制执行垃圾收集事件的按钮。
② 捕获堆转储的按钮。
③ 记录内存分配的按钮。
④ 放大时间线的按钮。
⑤ 跳转到实时内存数据的按钮。
⑥ 事件时间线显示活动状态、用户输入事件和屏幕旋转事件。
⑦ 内存使用时间表,其中包括以下内容:
每个内存类别使用多少内存的堆栈图,如左边的y轴和顶部的颜色键所示。
虚线表明已分配对象的数量,如右侧y轴所示。
每个垃圾收集事件的图标。
但是,默认情况下并不是所有的分析数据都可见。如果您看到一条消息,说“高级分析不可用于所选进程”,则需要启用高级分析以查看以下内容:
活动时间表
分配对象的数量
垃圾收集事件
提示: 与之前的Android监控工具相比,新的内存分析器记录了你的内存使用情况,所以看起来你的内存使用量会更高。内存分析器监视一些额外的类别,这些类别增加了总数,但如果您只关心Java堆内存,那么“Java”的数字应该与上一个Android监视器的值类似。新的号码记录了从Zygote分派到应用程序的Java堆中的所有物理内存页面,这准确表明您的应用程序实际使用多少物理内存。
2.3 记录内存分配
查看堆转储时,查看分配了多少内存的快照很有用,它不会显示如何分配内存。为此,您需要记录内存分配。完成记录会话后,您可以看到以下记录的持续时间:
分配了哪些对象以及它们使用了多少空间。
在堆栈跟踪中分配每个对象的位置,其中包括线程。
image
要查看应用程序的内存分配,请单击内存分析器工具栏中的Record memory allocations。当它记录时,与你的应用程序进行交互,以引起内存溢出或内存泄漏。完成后,单击Stop recording。
分配的对象列表出目前时间轴下面,按类名称分组,按堆计数排序,如上图所示。
分配跟踪器最多记录65535个分配。如果您的记录超出此限制,则只有最近65535个分配将保存在该记录中。
要检查分配记录,请按照下列步骤操作:
浏览列表以查找具有超级大的堆计数且可能泄漏的对象,要协助查找已知类,请单击类名列标题按字母顺序排序。然后单击一个类名,Instance View 窗格就会显示在右侧,显示该类的每个实例,如下图所示。
在Instance View窗格中,单击一个实例。Call Stack选项卡显示在下面,显示了哪个实例被分配在哪个线程中。
在Call Stack选项卡中,单击任意行可以在编辑器中跳转到该代码。

默认情况下,列表是按类名排列的。在列表的顶部,您可以使用右下拉菜单在列表之间切换:
Arrange by class: 根据类名分配。
Arrange by package:根据包名分配。
Arrange by callstack: 根据调用堆栈排序
2.4 捕获堆转储
堆转储显示在捕获堆转储时应用程序正在使用内存的对象。特别是在扩展用户会话之后,堆转储可以通过显示依旧在内存中的对象来协助识别内存泄漏。捕获堆转储后,可以查看以下内容:
您的应用程序分配了哪些类型的对象,以及每个对象的数量。
每个对象使用多少内存
每个对象的引用被保留在你的代码中。
调用堆栈,用于分配对象的位置(只有在记录分配时捕获堆转储)。

要捕获堆转储,单击Memory-Profiler工具栏中的dump Java堆image。在转储堆时,Java内存的数量可能会暂时增加。这是正常的,由于堆转储发生在与应用程序一样的进程中,需要一些内存来收集数据。
堆转储出目前内存时间轴下方,显示堆中的所有类类型,如上图所示。
要检查你的堆,请按照下列步骤操作:
浏览列表以查找具有异常大堆计数的对象,由于它可能会被泄露。为了协助查找已知类,请单击类名列标题以按字母顺序排序。然后单击类名。实例视图窗格出目前右边,显示该类的每个实例,如下图所示。
在Instance View窗格中,单击一个实例。 References选项卡显示在下面,显示对该对象的所有引用。或者单击实例名称旁边的箭头以查看其所有字段,然后单击字段名称以查看其所有引用。如果要查看某个字段的实例详细信息,请右键单击该字段,然后选择Go to Instance。
在References选项卡中,如果识别可能是内存泄漏的引用,请右键单击它,然后选择Go to Instance.。这将从堆转储中选择相应的实例,显示您自己的实例数据。
默认情况下,堆转储不会显示每个已分配对象的堆栈跟踪。要获取堆栈跟踪,您必须在单击转储Java堆之前开始记录内存分配。如果您这样做,您可以在实例视图中选择一个实例,并在References选项卡旁边看到Call Stack选项卡,如下图所示。但是,在开始记录分配之前,可能已经分配了一些对象,因此这些对象无法使用调用堆栈。包含一个调用堆栈的实例在图标上有一个stack标记image。

在classes列表中,您可以看到以下信息:
Heap Count: 堆中的实例数。
Shallow Size: 此堆中所有实例的总大小(以字节为单位)。
Retained Size: 这个类的所有实例(以字节为单位)保留的内存总大小。
在类列表的顶部,可以使用左下拉列表在以下堆转储之间切换:
Default heap: 当系统没有指定堆时。
App heap: 应用程序分配内存的主堆。
Image heap: 系统引导映像,包含在引导期间预加载的类。这里的分配保证永远不会移动或离开。
Zygote heap: Android系统中分发应用程序进程的写时复制堆
默认情况下,列表按保留大小列排序。您可以单击任何列标题来更改列表的排序方式。
在Instance View中,每个实例包括以下内容:
Depth:从任何GC根到所选实例的跳数最短。
Shallow Size:此实例的大小。
Retained Size:此实例支配的内存大小(根据支配者树)。
















暂无评论内容