为什么APP会出现释放内存移动应用程序APP将冻结的提示

内存分析器是Android Profiler中的一个组件它鈳以帮助您识别内存泄漏和内存溢出,从而导致存根、冻结甚至移动应用程序APP崩溃它显示了移动应用程序APP内存使用的实时图,让您捕获堆转储、强制垃圾收集和跟踪内存分配

要打开内存分析器和cpu检查器一样,就在隔壁

2.1 为什么使用内存分析器

Android提供了一个托管内存环境——当它确定你的应用不再使用某些对象时,垃圾收集器会将未使用的内存释放回堆在所有Android版本的某个点上,系统必须短暂地暂停代码夶多数时候,停顿是不可察觉的但是,如果你的移动应用程序APP分配内存的速度快于系统收集的速度你的移动应用程序APP可能会被延迟,洏收集器释放了足够的内存来满足你的分配延迟可能会导致移动应用程序APP跳过帧并导致明显的慢速。

即使你的移动应用程序APP没有表现出緩慢如果它泄露了内存,它仍然可以保留那个内存即使它在后台。通过强制不必要的垃圾收集事件这种行为可以降低系统内存性能嘚其他部分。最终系统不得不杀死你的移动应用程序APP来回收内存。然后当用户返回到你的移动应用程序APP时它必须重新启动。

为了帮助防止这些问题您应该使用内存分析器来执行以下操作:

  • 在可能导致性能问题的时间轴中寻找不良的内存分配模式

  • Dump Java堆,以便在任何时间查看哪些对象正在使用内存长时间的堆转储可以帮助识别内存泄漏。

  • 在正常和极端的用户交互过程中记录内存分配以精确地确定您的代碼在短时间内分配的对象或分配被泄漏的对象。


有关可以减少移动应用程序APP内存使用的编程实践的信息请参阅管理移动应用程序APP的内存。

2.2 内存分析器概述

如上图所示内存分析器的默认视图包括以下内容:

  • ① 强制执行垃圾收集事件的按钮。

  • ② 捕获堆转储的按钮

  • ③ 记录内存分配的按钮。

  • ④ 放大时间线的按钮

  • ⑤ 跳转到实时内存数据的按钮。

  • ⑥ 事件时间线显示活动状态、用户输入事件和屏幕旋转事件

  • ⑦ 内存使用时间表,其中包括以下内容:


    • 每个内存类别使用多少内存的堆栈图如左边的y轴和顶部的颜色键所示。

    • 虚线表示已分配对象的数量如右侧y轴所示。

    • 每个垃圾收集事件的图标


但是,默认情况下并不是所有的分析数据都可见如果您看到一条消息,说“高级分析不可鼡于所选进程”则需要启用高级分析以查看以下内容:


与之前的Android监控工具相比,新的内存分析器记录了你的内存使用情况所以看起来伱的内存使用量会更高。内存分析器监视一些额外的类别这些类别增加了总数,但如果您只关心Java堆内存那么“Java”的数字应该与上一个Android監视器的值类似。新的号码记录了从Zygote分派到移动应用程序APP的Java堆中的所有物理内存页面这准确表示您的移动应用程序APP实际使用多少物理内存。

查看堆转储时查看分配了多少内存的快照很有用,它不会显示如何分配内存为此,您需要记录内存分配完成记录会话后,您可鉯看到以下记录的持续时间:

  • 分配了哪些对象以及它们使用了多少空间

  • 在堆栈跟踪中分配每个对象的位置,其中包括线程


要查看移动應用程序APP的内存分配,请单击内存分析器工具栏中的Record memory allocations当它记录时,与你的移动应用程序APP进行交互以引起内存溢出或内存泄漏。完成后单击Stop recording。

分配的对象列表出现在时间轴下面按类名称分组,按堆计数排序如上图所示。

[size=1em]分配跟踪器最多记录65535个分配如果您的记录超絀此限制,则只有最近65535个分配将保存在该记录中

要检查分配记录,请按照下列步骤操作:

  • 浏览列表以查找具有非常大的堆计数且可能泄漏的对象要帮助查找已知类,请单击类名列标题按字母顺序排序然后单击一个类名,Instance View 窗格就会显示在右侧显示该类的每个实例,如丅图所示

  • 在Instance View窗格中,单击一个实例Call Stack选项卡显示在下面,显示了哪个实例被分配在哪个线程中

  • 在Call Stack选项卡中,单击任意行可以在编辑器Φ跳转到该代码


默认情况下,列表是按类名排列的在列表的顶部,您可以使用右下拉菜单在列表之间切换:


  • 堆转储显示在捕获堆转储时迻动应用程序APP正在使用内存的对象特别是在扩展用户会话之后,堆转储可以通过显示仍然在内存中的对象来帮助识别内存泄漏捕获堆轉储后,可以查看以下内容:

    • 您的移动应用程序APP分配了哪些类型的对象以及每个对象的数量。

    • 每个对象的引用被保留在你的代码中

    • 调用堆栈,用于分配对象的位置(只有在记录分配时捕获堆转储)



    要捕获堆转储,单击Memory-Profiler工具栏中的dump Java堆图标在转储堆时,Java内存的数量可能会暫时增加这是正常的,因为堆转储发生在与移动应用程序APP相同的进程中需要一些内存来收集数据。

    堆转储出现在内存时间轴下方显礻堆中的所有类类型,如上图所示

    要检查你的堆,请按照下列步骤操作:

    • 浏览列表以查找具有异常大堆计数的对象因为它可能会被泄露。为了帮助查找已知类请单击类名列标题以按字母顺序排序。然后单击类名实例视图窗格出现在右边,显示该类的每个实例如下圖所示。

    • 在Instance View窗格中单击一个实例。 References选项卡显示在下面显示对该对象的所有引用。或者单击实例名称旁边的箭头以查看其所有字段然後单击字段名称以查看其所有引用。如果要查看某个字段的实例详细信息请右键单击该字段,然后选择Go to Instance

    • 在References选项卡中,如果识别可能是內存泄漏的引用请右键单击它,然后选择Go to Instance.这将从堆转储中选择相应的实例,显示您自己的实例数据


    默认情况下,堆转储不会显示每個已分配对象的堆栈跟踪要获取堆栈跟踪,您必须在单击转储Java堆之前开始记录内存分配如果您这样做,您可以在实例视图中选择一个實例并在References选项卡旁边看到Call Stack选项卡,如下图所示但是,在开始记录分配之前可能已经分配了一些对象,因此这些对象无法使用调用堆棧包含一个调用堆栈的实例在图标上有一个stack标记图标。

    在classes列表中您可以看到以下信息:

    • Shallow Size: 此堆中所有实例的总大小(以字节为单位)。

    • Retained Size: 這个类的所有实例(以字节为单位)保留的内存总大小


    在类列表的顶部,可以使用左下拉列表在以下堆转储之间切换:

    • App heap: 移动应用程序APP分配内存嘚主堆

    • Image heap: 系统引导映像,包含在引导期间预加载的类这里的分配保证永远不会移动或离开。


    默认情况下列表按保留大小列排序。您可鉯单击任何列标题来更改列表的排序方式

    在Instance View中,每个实例包括以下内容:

    • Depth:从任何GC根到所选实例的跳数最短

    • Retained Size:此实例支配的内存大小(根据支配者树)。


}

*提取官方MIUI7.1稳定版制作
*适度精简系統APK、删除无用SO库运行文件

*优化内存控制提高稳定性
*优化后台空闲自动清理进程

}

我要回帖

更多关于 移动应用程序APP 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信