热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android性能优化之内存篇

flyme2012的专栏目录视图摘要视图订阅新版极客头条上线,每天一大波干货任玉刚:Android开发者的职场规划从零练就iOS高手实战班震撼来袭新型数据库利弊谈


flyme2012的专栏

  • 目录视图
  • 摘要视图
  • 订阅
新版极客头条上线,每天一大波干货     任玉刚:Android开发者的职场规划     从零练就iOS高手实战班震撼来袭     新型数据库利弊谈     分类: Android 23人阅读 评论(0) 收藏 举报Android内存

目录(?)[+]

下面是内存篇章的学习笔记,部分内容与前面的性能优化典范有重合,欢迎大家一起学习交流!

1)Memory, GC, and Performance

众所周知,与C/C++需要通过手动编码来申请以及释放内存有所不同,Java拥有GC的机制。Android系统里面有一个Generational Heap Memory的 模型,系统会根据内存中不同的内存数据类型分别执行不同的GC操作。例如,最近刚分配的对象会放在Young Generation区域,这个区域的对象通常都是会快速被创建并且很快被销毁回收的,同时这个区域的GC操作速度也是比Old Generation区域的GC操作速度更快的。

除了速度差异之外,执行GC操作的时候,所有线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行。

通常来说,单个的GC并不会占用太多时间,但是大量不停的GC操作则会显著占用帧间隔时间(16ms)。如果在帧间隔时间里面做了过多的GC操作,那么自然其他类似计算,渲染等操作的可用时间就变得少了。

2)Memory Monitor Walkthrough

Android Studio中的Memory Monitor可以很好的帮助我们查看程序的内存使用情况。

3)Memory Leaks

内存泄漏表示的是不再用到的对象因为被错误引用而无法进行回收。

发生内存泄漏会导致Memory Generation中的剩余可用Heap Size越来越小,这样会导致频繁触发GC,更进一步引起性能问题。

举例内存泄漏,下面init()方法来自某个自定义View:

1234 private void init() {    ListenerCollector collector = new ListenerCollector();    collector.setListener(this, mListener);}

上面的例子容易存在内存泄漏,如果activity因为设备翻转而重新创建,自定义的View会自动重新把新创建出来的mListener给绑定到ListenerCollector中,但是当activity被销毁的时候,mListener却无法被回收了。

4)Heap Viewer Walkthrough

下图演示了Android Tools里面的Heap Viewer的功能,我们可以看到当前进程中的Heap Size的情况,分别有哪些类型的数据,占比是多少。

5)Understanding Memory Churn

Memory Churn内存抖动,内存抖动是因为在短时间内大量的对象被创建又马上被释放。瞬间产生大量的对 象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,会触发GC从而导致刚产生的对象又很快被回收。即使每次分配的对象占用了很少的内存, 但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。

解决上面的问题有简洁直观方法,如果你在Memory Monitor里面查看到短时间发生了多次内存的涨跌,这意味着很有可能发生了内存抖动。

同时我们还可以通过Allocation Tracker来查看在短时间内,同一个栈中不断进出的相同对象。这是内存抖动的典型信号之一。

当你大致定位问题之后,接下去的问题修复也就显得相对直接简单了。例如,你需要避免在for循环里面分配对象占用内存,需要尝试把对象的创建移到循 环体之外,自定义View中的onDraw方法也需要引起注意,每次屏幕发生绘制以及动画执行过程中,onDraw方法都会被调用到,避免在onDraw 方法里面执行复杂的操作,避免创建对象。对于那些无法避免需要创建对象的情况,我们可以考虑对象池模型,通过对象池来解决频繁创建与销毁的问题,但是这里 需要注意结束使用之后,需要手动释放对象池中的对象。

6)Allocation Tracker

关于Allocation Tracker工具的使用,不展开了,参考下面的链接:

  • http://developer.android.com/tools/debugging/ddms.html#alloc

  • http://android-developers.blogspot.com/2009/02/track-memory-allocations.html

7)Improve Your Code To Reduce Churn

下面演示一个例子,如何通过修改代码来避免内存抖动。优化之前的内存检测图:

定位代码之后,修复了String拼接的问题:

优化之后的内存监测图:

8)Recap

上面提到了三种测量内存的工具,下面再简要概括一下他们各自的特点:

  • Memory Monitor:跟踪整个app的内存变化情况。

  • Heap Viewer:查看当前内存快照,便于对比分析哪些对象有可能发生了泄漏。

  • Allocation Tracker:追踪内存对象的来源。


    来源: >
主题推荐
性能优化 内存 android performance rgb
猜你在找
iOS8开发技术(Swift版):iOS基础知识
反编译Android应用
Apple Watch开发入门
Android5.0新特征详解(Material Design入门篇)
网络赚钱靠谱项目推荐
Android 性能优化之使用MAT分析内存泄露问题
关于Android内存管理及性能优化的一些细节
关于Android内存管理及性能优化的一些细节
Android 性能优化系列内存之提升篇--应用应该如何管理内存
Android 性能优化之使用MAT分析内存泄露问题
准备好了么?  更多职位尽在 
iOS开发工程师 上海彩亿信息技术有限公司 8-15K/月 我要跳槽
移动-IOS开发工程师 北京爱奇艺科技有限公司 15-30K/月 我要跳槽
iOS 人民网股份有限公司 12-15K/月 我要跳槽
IOS工程师 路普达网络科技(北京)有限公司 10-20K/月 我要跳槽
查看评论
  暂无评论

发表评论
  • 用 户 名:
  • Leaning_wk
  • 评论内容:
  • 插入代码
      
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
核心技术类目
全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker OpenStackVPN Spark ERP IE10 Eclipse CRM Javascript 数据库 Ubuntu NFC WAP jQueryBI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS UnitySplashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStackFTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide MaemoCompuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure SolrAngular Cloud Foundry Redis Scala Django Bootstrap
    个人资料
     
    flyme2012
     
    • 访问:5306次
    • 积分:228
    • 等级: 
    • 排名:千里之外
    • 原创:13篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章搜索
    文章分类
  • Android(15)
    文章存档
  • 2015年07月(2)
  • 2015年06月(10)
  • 2014年08月(3)
    阅读排行
  • Android自定义之流式布局(306)
  • Android之TextView的样式类Span的使用详解(297)
  • Android之自定义(上方标题随ViewPager手势慢慢滑动)(257)
  • 自定义之仪表盘(247)
  • Android之TextView的Span样式源码剖析(238)
  • 随着ScrollView的滑动,渐渐的执行动画View(232)
  • 仿微信主界面导航栏图标字体颜色的变化(228)
  • android自定义之 5.0 风格progressBar(220)
  • Android自定义之仿360Root大师水纹效果(179)
  • Android自定义之TextView跑马灯的监听(160)
    评论排行
  • OnCreate方法中测量控件宽高(0)
  • Android自定义之仿360Root大师水纹效果(0)
  • Android性能优化之内存篇(0)
  • 自定义之仪表盘(0)
  • Android之自定义(上方标题随ViewPager手势慢慢滑动)(0)
  • Android之TextView的Span样式源码剖析(0)
  • android Viewpager取消预加载及Fragment方法的学习(0)
  • Android自定义之流式布局(0)
  • android自定义之 5.0 风格progressBar(0)
  • 随着ScrollView的滑动,渐渐的执行动画View(0)
    推荐文章
公司简介 | 招贤纳士 | 广告服务 | 银行汇款帐号 | 联系方式 | 版权声明 | 法律顾问 | 问题报告 | 合作伙伴 | 论坛反馈
网站客服 杂志客服 微博客服 webmaster@csdn.net 400-600-2320 | 北京创新乐知信息技术有限公司 版权所有 | 江苏乐知网络技术有限公司 提供商务支持
 

flyme2012的专栏

  • 目录视图
  • 摘要视图
  • 订阅
新版极客头条上线,每天一大波干货     任玉刚:Android开发者的职场规划     从零练就iOS高手实战班震撼来袭     新型数据库利弊谈     

Android性能优化之内存篇分类: Android 23人阅读 评论(0) 收藏 举报Android内存

目录(?)[+]

下面是内存篇章的学习笔记,部分内容与前面的性能优化典范有重合,欢迎大家一起学习交流!

1)Memory, GC, and Performance

众所周知,与C/C++需要通过手动编码来申请以及释放内存有所不同,Java拥有GC的机制。Android系统里面有一个Generational Heap Memory的 模型,系统会根据内存中不同的内存数据类型分别执行不同的GC操作。例如,最近刚分配的对象会放在Young Generation区域,这个区域的对象通常都是会快速被创建并且很快被销毁回收的,同时这个区域的GC操作速度也是比Old Generation区域的GC操作速度更快的。

除了速度差异之外,执行GC操作的时候,所有线程的任何操作都会需要暂停,等待GC操作完成之后,其他操作才能够继续运行。

通常来说,单个的GC并不会占用太多时间,但是大量不停的GC操作则会显著占用帧间隔时间(16ms)。如果在帧间隔时间里面做了过多的GC操作,那么自然其他类似计算,渲染等操作的可用时间就变得少了。

2)Memory Monitor Walkthrough

Android Studio中的Memory Monitor可以很好的帮助我们查看程序的内存使用情况。

3)Memory Leaks

内存泄漏表示的是不再用到的对象因为被错误引用而无法进行回收。

发生内存泄漏会导致Memory Generation中的剩余可用Heap Size越来越小,这样会导致频繁触发GC,更进一步引起性能问题。

举例内存泄漏,下面init()方法来自某个自定义View:

1234 private void init() {    ListenerCollector collector = new ListenerCollector();    collector.setListener(this, mListener);}

上面的例子容易存在内存泄漏,如果activity因为设备翻转而重新创建,自定义的View会自动重新把新创建出来的mListener给绑定到ListenerCollector中,但是当activity被销毁的时候,mListener却无法被回收了。

4)Heap Viewer Walkthrough

下图演示了Android Tools里面的Heap Viewer的功能,我们可以看到当前进程中的Heap Size的情况,分别有哪些类型的数据,占比是多少。

5)Understanding Memory Churn

Memory Churn内存抖动,内存抖动是因为在短时间内大量的对象被创建又马上被释放。瞬间产生大量的对 象会严重占用Young Generation的内存区域,当达到阀值,剩余空间不够的时候,会触发GC从而导致刚产生的对象又很快被回收。即使每次分配的对象占用了很少的内存, 但是他们叠加在一起会增加Heap的压力,从而触发更多其他类型的GC。这个操作有可能会影响到帧率,并使得用户感知到性能问题。

解决上面的问题有简洁直观方法,如果你在Memory Monitor里面查看到短时间发生了多次内存的涨跌,这意味着很有可能发生了内存抖动。

同时我们还可以通过Allocation Tracker来查看在短时间内,同一个栈中不断进出的相同对象。这是内存抖动的典型信号之一。

当你大致定位问题之后,接下去的问题修复也就显得相对直接简单了。例如,你需要避免在for循环里面分配对象占用内存,需要尝试把对象的创建移到循 环体之外,自定义View中的onDraw方法也需要引起注意,每次屏幕发生绘制以及动画执行过程中,onDraw方法都会被调用到,避免在onDraw 方法里面执行复杂的操作,避免创建对象。对于那些无法避免需要创建对象的情况,我们可以考虑对象池模型,通过对象池来解决频繁创建与销毁的问题,但是这里 需要注意结束使用之后,需要手动释放对象池中的对象。

6)Allocation Tracker

关于Allocation Tracker工具的使用,不展开了,参考下面的链接:

  • http://developer.android.com/tools/debugging/ddms.html#alloc

  • http://android-developers.blogspot.com/2009/02/track-memory-allocations.html

7)Improve Your Code To Reduce Churn

下面演示一个例子,如何通过修改代码来避免内存抖动。优化之前的内存检测图:

定位代码之后,修复了String拼接的问题:

优化之后的内存监测图:

8)Recap

上面提到了三种测量内存的工具,下面再简要概括一下他们各自的特点:

  • Memory Monitor:跟踪整个app的内存变化情况。

  • Heap Viewer:查看当前内存快照,便于对比分析哪些对象有可能发生了泄漏。

  • Allocation Tracker:追踪内存对象的来源。


    来源: >
主题推荐
性能优化 内存 android performance rgb
猜你在找
iOS8开发技术(Swift版):iOS基础知识
反编译Android应用
Apple Watch开发入门
Android5.0新特征详解(Material Design入门篇)
网络赚钱靠谱项目推荐
Android 性能优化之使用MAT分析内存泄露问题
关于Android内存管理及性能优化的一些细节
关于Android内存管理及性能优化的一些细节
Android 性能优化系列内存之提升篇--应用应该如何管理内存
Android 性能优化之使用MAT分析内存泄露问题
准备好了么?  更多职位尽在 
iOS开发工程师 上海彩亿信息技术有限公司 8-15K/月 我要跳槽
移动-IOS开发工程师 北京爱奇艺科技有限公司 15-30K/月 我要跳槽
iOS 人民网股份有限公司 12-15K/月 我要跳槽
IOS工程师 路普达网络科技(北京)有限公司 10-20K/月 我要跳槽
查看评论
  暂无评论

发表评论
  • 用 户 名:
  • Leaning_wk
  • 评论内容:
  • 插入代码
      
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
核心技术类目
全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬件 Docker OpenStackVPN Spark ERP IE10 Eclipse CRM Javascript 数据库 Ubuntu NFC WAP jQueryBI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS UnitySplashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStackFTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide MaemoCompuware 大数据 aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure SolrAngular Cloud Foundry Redis Scala Django Bootstrap
    个人资料
     
    flyme2012
     
    • 访问:5306次
    • 积分:228
    • 等级: 
    • 排名:千里之外
    • 原创:13篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章搜索
    文章分类
  • Android(15)
    文章存档
  • 2015年07月(2)
  • 2015年06月(10)
  • 2014年08月(3)
    阅读排行
  • Android自定义之流式布局(306)
  • Android之TextView的样式类Span的使用详解(297)
  • Android之自定义(上方标题随ViewPager手势慢慢滑动)(257)
  • 自定义之仪表盘(247)
  • Android之TextView的Span样式源码剖析(238)
  • 随着ScrollView的滑动,渐渐的执行动画View(232)
  • 仿微信主界面导航栏图标字体颜色的变化(228)
  • android自定义之 5.0 风格progressBar(220)
  • Android自定义之仿360Root大师水纹效果(179)
  • Android自定义之TextView跑马灯的监听(160)
    评论排行
  • OnCreate方法中测量控件宽高(0)
  • Android自定义之仿360Root大师水纹效果(0)
  • Android性能优化之内存篇(0)
  • 自定义之仪表盘(0)
  • Android之自定义(上方标题随ViewPager手势慢慢滑动)(0)
  • Android之TextView的Span样式源码剖析(0)
  • android Viewpager取消预加载及Fragment方法的学习(0)
  • Android自定义之流式布局(0)
  • android自定义之 5.0 风格progressBar(0)
  • 随着ScrollView的滑动,渐渐的执行动画View(0)
    推荐文章
公司简介 | 招贤纳士 | 广告服务 | 银行汇款帐号 | 联系方式 | 版权声明 | 法律顾问 | 问题报告 | 合作伙伴 | 论坛反馈
网站客服 杂志客服 微博客服 webmaster@csdn.net 400-600-2320 | 北京创新乐知信息技术有限公司 版权所有 | 江苏乐知网络技术有限公司 提供商务支持
 

推荐阅读
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Python中程序员的面试题有哪些
    小编给大家分享一下Python中程序员的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
author-avatar
倩-1130
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有