Android | App内存优化 之 内存问题及相关工具概述

简介: Android | App内存优化 之 内存问题及相关工具概述

背景

  • 内存是大问题但普遍缺乏关注

内存问题比较隐蔽,表现不明显;
内存问题相对复杂,内存问题不是孤立的,它是一个累积的过程;



内存问题

  • 内存抖动:工具内存图显现锯齿状;

导致GC频繁,进而导致程序卡顿;

  • **内存泄漏:可用内存逐渐减少;

如果程序没有内存,还是要申请内存的话,程序就会企图通过GC回收得到内存,
如此可能导致频繁GC,也会产生卡顿;**

  • 内存溢出:OOM,导致程序异常、崩溃;



工具

  • Memory Profiler
  • Memory Analyzer
  • LeakCanary( Leak n.泄漏; Canary n.[动]金丝雀; 淡黄色; )



Memory Profiler

  • 是Android Studio 工具
  • 实时图表展示应用内存使用量
  • 识别内存泄漏、抖动(图形出现锯齿状)等

这里识别的内存泄漏,只是一个简单的判断,

  • 提供捕获堆转储强制GC以及跟踪内存分配的能力
  • 方便直观,线下平时使用
实战(笔者环境是 AS 3.3.1)
  • **打开并运行项目,

可以看到一个这样的图标,即是Memory Profiler**

  • 或者在顶层栏如下操作:

选中后工具图标就会出现在下方:

  • **点击工具,把工具界面往上拉,

可以看到它左上角有一个加号
点击之后可以选择想要跟踪的进程:**

  • **可以看到有四块分区——CPU、MEMORY(内存)、NETWORK(网络)、ENERGY

当然我们这里只关注MEMORY(内存)
可以点击上图中的MEMORY(内存)区域
进入更详细的图表:**

  • **上面有个垃圾桶的图标,

点击一次即进行一次GC操作:**

  • **另外是GC按钮右边的这个按钮,

实现的是堆转储的功能,
将内存当中的信息转成一个文件:**

  • **堆转储按钮右侧,有一个Recode按钮,可以记录点击之后的分配内存的情况,

这个按钮只有测试机在Android7.1或更低版本的系统才可以显示出来,
高版本不显示;**

  • 右上的按钮,其实就是放大缩小图表显示的功能:
  • **把鼠标放在图表上,会实时显示一条时刻线以及对应时刻的数据表,

第一行是对应的时间时刻,
往后是对应时间的内存使用情况:
Total,总使用内存;**

  • Java:从 Java 或 Kotlin 代码分配的对象内存。
  • Native:从 C 或 C++ 代码分配的对象内存。

即使应用中不使用 C++,也可能会看到此处使用的一些原生内存,
因为 Android 框架使用原生内存代表我们处理各种任务,如处理图像资源和其他图形时,即使我们编写的代码采用 Java 或 Kotlin 语言。

  • Graphics:图形缓冲区队列向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。 (请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。)
  • Stack: 应用中的原生堆栈和 Java 堆栈使用的内存。 这通常与我们的应用运行多少线程有关。
  • Code:应用用于处理代码和资源

(如 Java文件、dex 字节码、已优化或已编译的 dex 码、.so 库和字体)的内存。

  • Other:应用使用的系统不确定如何分类的内存。
  • Allocated:应用分配的 Java/Kotlin 对象数。 它没有计入 C 或 C++ 中分配的对象。

当连接至运行 Android 7.1 及更低版本的设备时,此分配仅在 Memory Profiler 连接至我们运行的应用时才开始计数。
因此,开始分析之前分配的任何对象都不会被计入。
不过,Android 8.0 附带一个设备内置分析工具,该工具可记录所有分配,
因此,在 Android 8.0 及更高版本上,
此数字始终表示我们的应用中待处理的 Java 对象总数。

  • 操作堆转储功能,点击堆转储按钮,

工具会自动把一定时间内的分配内存情况
以文件的方式展现出来:右上角的Allocation代表着已经分配的对象(数目)
Shallow Size:此堆中所有实例的总大小(以字节为单位)。
Retained Size:为此类的所有实例而保留的内存总大小(以字节为单位)

  • **在左边点击一下Bitmap的这个Class,

可以看到右边会弹出一个窗口,显示Bitmap所创建的对象:**

  • 点击任意一个实例对象,又可以看进一步的详细信息:
  • Depth:从任意 GC 根到所选实例的最短 hop 数。
  • Shallow Size:此实例的大小。
  • Retained Size:此实例支配的内存大小(根据 dominator 树))。
  • **如此我们便可以知道内存当中有多少Bitmap,

以及Bitmap长什么样子(有的实例除了Reference这个栏,还会有Bitmap Preview一栏)**

  • **有时候有Allocation CallBack的栏目,

它记录的选中对象分配的位置,也就是该对象是在哪个地方创建的:**
选中任意一个创建位置,可以右键之后,点击弹出项目的Jump to Source,直接跳转到源码对应的位置:



Memory Analyzer

  • 强大的Java Heap 分析工具,查找内存泄漏及内存占用
  • 生成整体报告、分析问题等;
  • 线下深入使用,配合Memory Profiler



LeakCanary






参考自 慕课网
相关文章
|
3月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
278 0
安卓项目:app注册/登录界面设计
|
6天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
23天前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
|
2月前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
71 8
|
4月前
|
存储 开发工具 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`配置文件夹、平台特定代码及共享代码等。
389 2
|
3月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
499 0
|
4月前
|
XML 数据库 Android开发
10分钟手把手教你用Android手撸一个简易的个人记账App
该文章提供了使用Android Studio从零开始创建一个简单的个人记账应用的详细步骤,包括项目搭建、界面设计、数据库处理及各功能模块的实现方法。
|
缓存 开发工具 Android开发
Android App性能评测分析-启动时间篇
1、前言 随着项目版本的迭代,App的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关,性能问题从应用的启动优化开始,下面会根据实际app性能测试案例,进行app性能评测之启动时间的分析和总结。
4300 0
|
Shell Linux 测试技术
Android App性能评测分析-cpu占用篇
1、前言 很多时候在使用APP的时候,手机可能会发热发烫。这是因为CPU使用率过高,CPU过于繁忙,会使整个手机无法响应用户,整体性能降低,用户体验就会很差,也容易引起ANR等等一系列问题。
5257 0
|
Java 测试技术 程序员
Android App性能评测分析-内存篇
1、内存了解 在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识、内存分配、内存管理机制等非常熟悉,才能排查问题。
2270 0

热门文章

最新文章