Andoid性能分析-内存

Andoid性能分析-内存

随着移动技术的发展,仅仅是完成功能早已是满足不了现有的需求了,除了产品设计,应用的操作体验、流畅度也成了留住用户的很重要的一方面。

应用的一些性能指标

  • 内存
  • CPU
  • GPU
  • 网络

针对应用的性能的优化,Android Studio也在逐渐完善自己的性能分析工具-Android Profiler,除此之外还有eclipse提供的一个分析工具MAT,这次我们只关注内存方面的性能优化。

为什么需要分析应用内存

Android 提供一个托管内存环境—当它确定您的应用不再使用某些对象时,垃圾回收器会将未使用的内存释放回堆中。 虽然 Android 查找未使用内存的方式在不断改进,但对于所有 Android 版本,系统都必须在某个时间点执行垃圾回收,Stop-the-world。这个大多数情况下不会被感知到。 但是如果应用分配内存的速度比系统回收内存的速度快,则当收集器释放足够的内存以满足分配需要时,应用可能会卡顿延迟,可能会导致应用跳帧,并使系统明显变慢。即使应用不会表现出变慢,但如果存在内存泄漏,即使应用进入后台运行也不会释放。 因此会强制执行不必要的垃圾回收操作,因而拖慢系统的内存性能。 最后,系统被迫终止应用进程以回收内存。

Android Profiler

要打开 Android Profiler 窗口,请按以下步骤操作:

  1. 点击 View > Tool Windows > Android Profiler(也可以点击工具栏中的 Android Profiler )。
  2. 在 Android Profiler 窗口顶部,选择您想要分析的设备和应用进程。
android profiler

启用高级分析

要显示高级分析数据,Android Studio 必须在您编译后的应用中插入监控逻辑。 高级分析工具提供的功能包括:

  • Event 时间线(所有分析器窗口中均有)
  • 分配对象数量(Memory Profiler 中)
  • 垃圾回收 Event(Memory Profiler 中)
  • 有关所有传输的文件的详情(Network Profiler 中)
要启用高级分析,可以按以下步骤操作:
  1. 选择 Run > Edit Configurations。
  2. 在左侧窗格中选择您的应用模块。
  3. 点击 Profiling 标签,然后勾选 Enable advanced profiling。

内存计数类别

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

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

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

  • Graphics:图形缓冲区队列向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。 (请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。)

  • Stack: 您的应用中的原生堆栈和 Java 堆栈使用的内存。 这通常与您的应用运行多少线程有关。

  • Code:您的应用用于处理代码和资源(如 dex 字节码、已优化或已编译的 dex 码、.so 库和字体)的内存。

  • Other:您的应用使用的系统不确定如何分类的内存。

  • Allocated:您的应用分配的 Java/Kotlin 对象数。 它没有计入 C 或 C++ 中分配的对象。

查看内存分配

image
  1. 浏览列表以查找堆计数异常大且可能存在泄漏的对象。 为帮助查找已知类,点击 Class Name 列标题以按字母顺序排序。 然后点击一个类名称。 此时在右侧将出现 Instance View 窗格,显示该类的每个实例。
  2. 在 Instance View 窗格中,点击一个实例。 此时下方将出现 Call Stack 标签,显示该实例被分配到何处以及哪个线程中。
  3. 在 Call Stack 标签中,点击任意行以在编辑器中跳转到该代码。

MAT

Overview

主要显示内存的分配,彩色区域为消耗的内存,灰色区域为空闲的内存。


overview

Leak Suspects

MAT会给出可能出现问题的地方,点击detail查看详情,不过个人感觉用处不大。


image

Histogram

在Histogram中有四列数据

  • Class Name:类名
  • Objects :堆中的实例数
  • Shallow Heap : 此堆中所有实例的总大小
  • Reained Heap: 为此类的所有实例而保留的内存总大小
image

同样在菜单栏中也可以选择设置列表的显示方式,个人比较习惯用package的方式,方便查看应用中哪些类可能泄露了。另外在顶部可以搜索想要查看的类.

image

Dominator Tree

在上面提到了Reained Heap,另一种解释是一个对象的Retained Set所包含对象所占内存的总大小,那什么是一个对象的Retained Set

Retained Set

什么可以作为GC Root?

image
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容