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






参考自
相关文章
|
1月前
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
85 1
|
1月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
118 0
安卓项目:app注册/登录界面设计
|
23天前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
45 2
|
2月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
108 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
2月前
|
Java 测试技术 Android开发
Android性能测试——发现和定位内存泄露和卡顿
本文详细介绍了Android应用性能测试中的内存泄漏与卡顿问题及其解决方案。首先,文章描述了使用MAT工具定位内存泄漏的具体步骤,并通过实例展示了如何分析Histogram图表和Dominator Tree。接着,针对卡顿问题,文章探讨了其产生原因,并提供了多种测试方法,包括GPU呈现模式分析、FPS Meter软件测试、绘制圆点计数法及Android Studio自带的GPU监控功能。最后,文章给出了排查卡顿问题的四个方向,帮助开发者优化应用性能。
148 4
Android性能测试——发现和定位内存泄露和卡顿
|
2月前
|
存储 开发工具 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`配置文件夹、平台特定代码及共享代码等。
123 2
|
2月前
|
XML Android开发 数据格式
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
在全球化背景下,实现Android应用的国际化与本地化至关重要。本文以一款旅游指南App为例,详细介绍如何通过资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗等步骤,完成多语言支持和本地化调整。通过邀请用户测试并收集反馈,确保应用能无缝融入不同市场,提升用户体验与满意度。
85 3
|
1月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
169 0
|
2月前
|
XML 数据库 Android开发
10分钟手把手教你用Android手撸一个简易的个人记账App
该文章提供了使用Android Studio从零开始创建一个简单的个人记账应用的详细步骤,包括项目搭建、界面设计、数据库处理及各功能模块的实现方法。
|
2月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
68 0