位置: 编程技术 - 正文

Android 内存与性能(android内存机制)

编辑:rootadmin
官方教程Android Performance 是 GOOGLE 近期发布在 Udacity 上的官方教程不方便科学上网的同学可以从我的百度网盘里下载。Android Performance Patterns 是 GOOGLE 在 年初发布在 Facebook 上的专题课程这部分内容 CDGChina 加了中文字幕,并放在 Youku 上了。

推荐整理分享Android 内存与性能(android内存机制),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:安卓手机运行内存和存储内存哪个更重要,安卓手机运行内存和存储内存哪个更重要,安卓内存运行机制,android内存性能优化,android 内核内存与用户内存,android内存机制,android内存机制,android内存机制,内容如对您有帮助,希望把文章链接给更多的朋友!

Notes

看来 Android 生态圈的性能和电量消耗等问题,已经严重到让 Google 不得不重视的地步啦 ~~

关于内存的几个理论知识

GC 的工作机制当 GC 工作时,虚拟机停止其他工作。频繁地触发 GC 进行内存回收,会导致系统性能严重下降。

内存抖动在极短的时间内,分配大量的内存,然后又释放它,这种现象就会造成内存抖动。典型地,在 View 控件的 onDraw 方法里分配大量内存,又释放大量内存,这种做法极易引起内存抖动,从而导致性能下降。因为 onDraw 里的大量内存分配和释放会给系统堆空间造成压力,触发 GC 工作去释放更多可用内存,而 GC 工作起来时,又会吃掉宝贵的帧时间 (帧时间是 ms) ,最终导致性能问题。

内存泄漏Java 语言的内存泄漏概念和 C/C&#;&#; 不太一样,在 Java 里是指不正确地引用导致某个对象无法被 GC 释放,从而导致可用内存越来越少。比如,一个图片查看程序,使用一个静态 Map 实例来缓存解码出来的 Bitmap 实例来加快加载进度。这个时候就可能存在内存泄漏。

内存泄漏会导致可用内存越来越少,从而导致频繁触发 GC 回收内存,进而导致性能下降。

调试工具

Memory Monitor Tool: 可以查阅 GC 被触发起来的时间序列,以便观察 GC 是否影响性能。Allocation Tracker Tool: 从 Android Studio 的这个工具里查看一个函数调用栈里,是否有大量的相同类型的 Object 被分配和释放。如果有,则其可能引起性能问题。MAT: 这是 Eclipse 的一个插件,也有 stand alone 的工具可以下载使用。

几个原则

别在循环里分配内存 (创建新对象)尽量别在 View 的 onDraw 函数里分配内存实在无法避免在这些场景里分配内存时,考虑使用对象池 (Object Pool)两个简单的实例

内存抖动

通过一个非常简单的例子来演示内存抖动。这个例子里,在自定义 View 的 onDraw 方法里大量分配内存来演示内存抖动和性能之间的关系。

版本一:

版本二:

内存抖动的特征:

从 Memory Monitor 来看,有毛刺出现。即短时间内分配大量的内存并触发 GC。

从 Allocation Tracker 里看,一次操作会有大量的内存分配产生。

内存泄漏

这个例子里,我们简单地让点击 Settings 菜单,就产生一个 KB 的内存泄漏。

内存泄漏的特征:

Android 内存与性能(android内存机制)

从 Memory Monitor 来看,内存占用越来越大

利用 MAT 工具进行专业分析。这是个很大的话题。几乎可以独立成几个章节来讲。可以参阅 MAT 本身自带的 Tutorials 来学习。另外,这篇文章里的分析方法是个不错的开始。

示例代码使用 Android Studio 开发环境,可以从这里下载。

利用 MAT 分析内存问题

内存泄漏

一个典型的问题是 Android 系统越用越慢。这种典型地是由内存泄漏引起的。一个很有用的解决这种问题的办法是:比较前后两个阶段的内存的使用情况。一般流程如下:

利用 ddms 工具 dump HPROF file利用 hprof-conv 把 dalvik &#;式的转换为普通 jvm &#;式重复步骤 1 和 2 抓出两份 LOG。利用 MAT 对两份 HRPOF 文件进行分析,结合代码找出可能存在的内存泄漏

比如针对拨号盘越来越慢的问题,我们可以开机后启动拨号盘,打进打出个电话。然后抓个 HPROF 文件。接着,再打进打出个电话,再抓一个 HPROF 文件。接着拿这两个文件对比分析,看是不是会造成电话打进打出越多,内存占用越多的情况发生。

HPROF文件

HPROF 简单地理解,就是从 jvm 里 dump 出来的内存和 CPU 使用情况的一个二进制文件。它的英文全名叫 A Heap/CPU Profiling Tool。这里有它完整的官方文档和它的历史介绍。

打开 MAT 后,会有一个 Tutorials 来教大家怎么用。这里列出几个操作步骤及其注意事项。

在 DDMS 里导出 HPROF 文件前,最好手动执行一下 GC。目的是让导出的内存全部是被引用的。否则在做内存占用对比时,会有很多不必要的内存占用被标识出来,干扰我们进行分析。进行对比时,最好是选择操作较多的和操作较少的对比,这样得出的 delta 是正数通过对比,发现内存泄漏时,可以用 OQL 来查询,并通过 Root to GC 功能来找到发生泄漏的源代码

在我们的示例程序里面,每次点击 Settings 菜单,都会导致一次KB的内存泄漏。下面是我们利用上面介绍的流程来查找内存泄漏问题。我们先点击 5 次 Settings 菜单,然后手动触发一次 GC,再导出 HPROF 文件。接着,我们再点击 6 次 Settings 菜单,然后手动触发一次 GC,再导出第二份 HPROF 文件。我们拿这两份 HPROF 就可以做一些对比。

通过上图可以看到,两次操作确实导致了某些类的实例增加了。图中可以清楚地看到 byte[] 和 java.util.HashMap$HashMapEntry 两个类增加得比较明显。这样,我们随便选择一个,通过 OQL 来查询系统中的这个内存。

从上图可以找到,本次 dump 出来的内存里,确实有很多个这个类的实例。在图上右击任何一个实例,右击,选择 Paths to GC roots,可以找到这个实例是被谁引用的。

从上图可以看出来,这个内存是被 MainActivity 里的 sCache 引用的。通过阅读代码,我们就可以找到这个漏洞了。即每次都往 sCache 里保存一个引用。

总结

Google 视频介绍的内容是硬知识,了解这些知识可以帮助我们写出高质量,高性能的代码。而 MAT, HPROF, Memory Monitor, Allocation Tracker 提供了一个“破案”的工具给我们。我们利用这些工具,倒回来去发现代码里的问题。

延伸阅读

关于 Android 性能优化,网络上有几篇比较好的文章,基本按照 GOOGLE 的官方教程翻译过来的,质量比较高。可以参考一下。

Android 性能优化内存篇-胡凯的博客Android性能优化典范-胡凯的博客

冷知识

GC 是在 年由 John McCarthy 发明的,此发明是为了解决 Lisp 编程语言里的内存问题的。《黑客和画家》作者,硅谷最有影响力的孵化器公司 YC 创立者 Paul Graham 高度评价 Lisp 语言,认为编程语言发展到现在,还是没有跳出 Lisp 语言在上世纪 年代所倡导的那些理念。并且,他还把自己当初创业,实现财务自由的项目 Viaweb 的成功归功于 Lisp 语言。详细可阅读 Paul Graham 的这篇博客和这篇博客。

[置顶] Android自定义控件(三)——打造闪闪发光的字体 介绍在小米的开机动画和一些欢迎界面中,我们经常看到这种闪闪发光的流光字体。看起来很炫酷,其实实现原理相当简单,我们只需要写自定义控件

[android] 签名 android签名,简单的来说就是生成一个apk文件,可供用户下载使用,但每个签名都有一定的过期时间,到期了要重新签名或延续时间步骤:首先进入你安

Android开发--总结 SocketAndroid开发socket通信——手机做server端C/S架构实现Android利用LocalSocket实现Java端进程与C端进程之间的IPCandroidsocket通信(上)androidsocket通信(下)androi

标签: android内存机制

本文链接地址:https://www.jiuchutong.com/biancheng/379634.html 转载请保留说明!

上一篇:Android 左右滑动菜单 DrawerLayout简单实现(android 左右滑动 库)

下一篇:[置顶] Android自定义控件(三)——打造闪闪发光的字体([置顶]游戏名:chivalry2)

  • 房产税计入管理费用了,汇算清缴怎么调
  • 公司购买二手房可以开增值税专用发票吗
  • 房产税的纳税义务人是房屋的产权所有人
  • 一般纳税人商品混凝土税率
  • 购买理财产品是什么意思?
  • 什么是边际税率高
  • 增值税的计税依据是什么
  • 房地产企业土地出让金抵减销项税额
  • 转出未交增值税在借方是什么意思
  • 小规模第一次申请发票能领多少
  • 劳务公司开出发票3年未收到钱
  • 模具费入什么会计科目
  • 中小企业现金流量表
  • 企业预算管理为何要以企业战略,核心竞争力,风险为导向
  • 企业购置节能节水专用设备
  • 工程收到奖励款怎么账务处理?
  • 固定资产盘亏账务处理例题
  • 出口货物退回需要进口税吗
  • 车辆购置税过户流程
  • 房地产增值税发票有什么用
  • 房屋征收服务中心是干什么的
  • 甲供工程选择适用简易计税方法后,36个月
  • 无人机开票税收编码是多少
  • 如何计算工程预付款
  • 滴滴打车怎么整
  • 总部员工调往下属单位
  • 企业销售费用支出怎么算
  • 全年一次性奖金税率表
  • 戴尔笔记本电脑哪款性价比最高
  • 公司餐饮费怎么做账
  • 把输入法关闭
  • mac语音备忘录文件怎样转换成mp3
  • win10如何查看显卡配置
  • s3tray2.exe - s3tray2是什么进程 有什么用
  • 结转消费成本的会计分录
  • 2015年4月4日摄于Tear Drop Arch附近的月全食,犹他州纪念碑谷 (© Alan Dyer/Alamy)
  • 应扣未扣应收未收税款是什么意思
  • 公司登记注册费每年都要交吗
  • 小规模纳税人低于30万怎么填报申报表
  • vue优化方案
  • php use of undefined constant
  • 二手车交易发票怎么收费
  • 增值税发票打印机
  • 高新技术企业研发费用加计扣除
  • php压缩文件怎么打开
  • 建筑企业预缴税率
  • 发票清单如何开具呢?
  • mysql关闭连接命令
  • 收到证券公司信息
  • 核定征收一般纳税人进项是否可抵扣
  • 医院绿化方案
  • 期末余额就是本年累计吗
  • 营业税费是借还是贷
  • 房地产企业城建税和教育费附加怎么算
  • 发票金额比实际支付金额大
  • 注册资本实缴制改为认缴制
  • 工业企业的生产费用包括哪些
  • sql实现选择操作
  • win2000服务器
  • 如何启动vmware authorization service
  • mac salad
  • 升级mac os
  • win10怎么用cmd删除文件
  • cocos2d开发的知名游戏
  • cocos2d用什么语言开发游戏
  • vue watch form
  • shell函数写法
  • jquery验证邮箱格式
  • activity的作用和生命周期
  • python连接MySQL数据库增删改查
  • js中overlay
  • javascript 类
  • 财政部国家税务总局
  • 四川省税务干部学校官网
  • 汽车维修增值税专用发票
  • 网上怎么申报地税
  • 个人限购
  • 青年文明号创建目标
  • 政务公开事项目录编制
  • 出口货物开票税率是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设