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按钮可以查看,
供我们参考;**






参考自
相关文章
|
2月前
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
100 1
|
2月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
163 0
安卓项目:app注册/登录界面设计
|
21天前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
40 11
|
20天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
21天前
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
2月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
51 2
|
3月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
216 2
|
3月前
|
XML Android开发 数据格式
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
在全球化背景下,实现Android应用的国际化与本地化至关重要。本文以一款旅游指南App为例,详细介绍如何通过资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗等步骤,完成多语言支持和本地化调整。通过邀请用户测试并收集反馈,确保应用能无缝融入不同市场,提升用户体验与满意度。
115 3
|
2月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
282 0
|
3月前
|
XML 数据库 Android开发
10分钟手把手教你用Android手撸一个简易的个人记账App
该文章提供了使用Android Studio从零开始创建一个简单的个人记账应用的详细步骤,包括项目搭建、界面设计、数据库处理及各功能模块的实现方法。