Android | App内存优化 之 全面理解MAT

简介: Android | App内存优化 之 全面理解MAT
**本文以上一篇博客
《Android | App内存优化 之 内存泄漏 要点概述 以及 解决实战》获得的 堆转储文件为例,
介绍一下 MAT工具;**
  • **MAT工具上侧有一系列的可选项,

现在看一下第一项,OverView,
也就是一个概览信息,
第一行是大小、Class对象、Object的数量、类加载器等等,
行末的Unreachable Objects Histogram可以点击查看可被回收的 但是仍然在内存当中 没被回收的对象**




  • **第二个图标按钮是Histogram单词直方图的意思),

该视图可以列出来,
某一个具体的Class它到底有多少实例,一个某一类型实例它的个数,及其
Shallow Heap,堆中 此类型所有实例 自身的总大小(以字节为单位),
Retained Heap,为 此类型的所有实例 而 保留的内存总大小(以字节为单位),
(在引用链上,此类型的所有实例占用的内存);同时我们可以在这个视图中(视图第一行),检索具体的某一个类的信息,
从而来判断该对象有没有存在内存泄漏的可能,
比如我们在上一篇博客《Android | App内存优化 之 内存泄漏 要点概述 以及 解决实战》
检索的就是MemoryLeakActivity

接着,
在下图中,该图标的下拉菜单中,
还有一个Group by package的菜单项:
也就是可以让视图中的实例,以包名的形式来进行摆放:默认是以类的形式进行摆放的,
Group by Class
通过Group by package视图查看形式
我们可以很容易地找到MemoryLeakActivity接下来,点击某一个实例,右键,
选择List objects -> with incoming references
我们在排查内存泄漏的过程中,
应该选择with incoming reference进行分析才行,!!!!!
查看 本(我们这个) 类型实例 被 谁/哪些类型实例 所引用,!!!!!
导致我们这个类型实例自身不能被回收,!!!!!
【!!!!
因为之所以内存泄漏,
就是某些没用的实例没有被及时正确回收,
而某个实例被别人引用了,也就回收不了了;
!!!!】
List objects下有两个菜单项,
with incoming reference
incoming 指过来
即指的是 引用到该选中实例的实例,
查看 本 类型实例 被 谁/哪些类型实例 所引用

with outcoming references
outcoming 指出去
被该选中实例引用的实例,
即查看本 类型实例 引用了 谁/哪些类型实例;)**



  • **第三个按钮,Dominator Tree(Dominator n.支配者,支配力,统治者;)

视图展示 每一个类型对象的 支配树(注意是每一个对象!!):关注百分比比较大的对象;
观察其能不能被回收,
以及为什么不能被回收;这里注意Percentage这个栏目,
显示的值 即该类型对象总共占了所有对象的百分之几;
比如说我们还是检索一下MemoryLeakActivity(注意这个视图也能够检索!!)
这里也能够,右键,
选择List objects选项:
!!!!
Histogram是基于 类型 分析,只分析类型, 不具体到某个实例,
Dominator Tree是基于 实例 分析, 具体到 某个实例;
!!!!
**





**第四个按钮是OQL,即 对象查询语言 , Object Query Language,
可以像检索数据库一样 检索 对象:
**





**第五个按钮,Thread OverView,
可以查看堆转储文件记录时,有多少线程在执行,
及其线程相关的信息**




Top Consumers 和 Leak Suspect

**Top Consumers 列出来那么占用内存比较高的对象;
Biggest Objects可以查看相关的更详细的信息;Leak Suspect则,
提供了两个Problem Suspect 自动化分析,配置有Detail按钮可以查看,
供我们参考;**






参考自
相关文章
|
7天前
|
开发工具 Android开发
|
7天前
|
Android开发
将AAB(Android App Bundle)转换为APK
将AAB(Android App Bundle)转换为APK
16 1
|
7天前
|
开发工具 Android开发
上架Google Play报错:For new apps, Android App Bundles must be signed with an RSA key.
上架Google Play报错:For new apps, Android App Bundles must be signed with an RSA key.
19 1
|
8天前
|
Android开发
Cannot create android app from an archive...containing both DEX and Java-bytecode content
Cannot create android app from an archive...containing both DEX and Java-bytecode content
11 2
|
8天前
|
编解码 Android开发 UED
【性能狂飙!】揭秘Android应用极速变身秘籍:内存瘦身+用户体验升级,打造丝滑流畅新境界!
【8月更文挑战第12天】构建高效Android应用需全方位优化,尤其重视内存管理和用户体验。通过弱引用降低内存占用,懒加载资源减少启动负担。运用Kotlin协程确保UI流畅不阻塞,响应式设计适配多屏需求。这些策略共同提升了应用性能与用户满意度。
19 1
|
18天前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
48 12
|
20天前
|
监控 Android开发 开发者
Android经典面试题之实战经验分享:如何简单实现App的前后台监听判断
本文介绍在Android中判断应用前后台状态的两种方法:`ActivityLifecycleCallbacks`和`ProcessLifecycleOwner`。前者提供精细控制,适用于需针对每个Activity处理的场景;后者简化前后台检测,适用于多数应用。两者各有优劣:`ActivityLifecycleCallbacks`更精确但复杂度高;`ProcessLifecycleOwner`更简便但可能在极端场景下略有差异。根据应用需求选择合适方法。
19 2
|
12天前
|
Java 开发工具 Android开发
Android经典面试题之开发中常见的内存泄漏,以及如何避免和防范
本文介绍Android开发中内存泄漏的概念及其危害,并列举了四种常见泄漏原因:静态变量持有Context、非静态内部类、资源未释放及监听器未注销。提供了具体代码示例和防范措施,如使用ApplicationContext、弱引用、适时释放资源及利用工具检测泄漏。通过遵循这些建议,开发者可以有效提高应用稳定性和性能。
23 0
|
18天前
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
21天前
|
监控 Java Android开发
探究Android应用开发中的内存泄漏检测与修复
在移动应用的开发过程中,优化用户体验和提升性能是至关重要的。对于Android平台而言,内存泄漏是一个常见且棘手的问题,它可能导致应用运行缓慢甚至崩溃。本文将深入探讨如何有效识别和解决内存泄漏问题,通过具体案例分析,揭示内存泄漏的成因,并提出相应的检测工具和方法。我们还将讨论一些最佳实践,帮助开发者预防内存泄漏,确保应用稳定高效地运行。