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:

1 2 3 4 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分析内存泄露问题
准备好了么? 跳吧             ! 更多职位尽在 CSDN JOB
iOS开发工程师 上海彩亿信息技术有限公司 | 8-15K/月 我要跳槽
移动-IOS开发工程师 北京爱奇艺科技有限公司 | 15-30K/月 我要跳槽
iOS 人民网股份有限公司 | 12-15K/月 我要跳槽
IOS工程师 路普达网络科技(北京)有限公司 | 10-20K/月 我要跳槽
id="ad_frm_0" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=4&containerId=ad_cen&frmId=ad_frm_0" style="border-width: 0px; overflow: hidden; width: 746px; height: 90px;"> 查看评论
  暂无评论

发表评论
  • 用 户 名:
  • Leaning_wk
  • 评论内容:
      
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 id="ad_frm_1" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=5&containerId=ad_bot&frmId=ad_frm_1" style="border-width: 0px; overflow: hidden; width: 746px; height: 0px;">
核心技术类目
全部主题  Hadoop  AWS  移动游戏  Java  Android  iOS  Swift  智能硬件  Docker  OpenStack VPN  Spark  ERP  IE10  Eclipse  CRM  JavaScript  数据库  Ubuntu  NFC  WAP  jQuery BI  HTML5  Spring  Apache  .NET  API  HTML  SDK  IIS  Fedora  XML  LBS  Unity Splashtop  UML  components  Windows Mobile  Rails  QEMU  KDE  Cassandra  CloudStack FTC  coremail  OPhone  CouchBase  云计算  iOS6  Rackspace  Web App  SpringSide  Maemo Compuware  大数据  aptech  Perl  Tornado  Ruby  Hibernate  ThinkPHP  HBase  Pure  Solr Angular  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)
    推荐文章
    id="ad_frm_2" frameborder="0" scrolling="no" src="http://blog.csdn.net/common/ad.html?t=12&containerId=ad_commend&frmId=ad_frm_2" style="border-width: 0px; overflow: hidden; width: 182px; height: 200px;">
公司简介 | 招贤纳士 | 广告服务 | 银行汇款帐号 | 联系方式 | 版权声明 | 法律顾问 | 问题报告 | 合作伙伴 | 论坛反馈
网站客服 杂志客服 微博客服 [email protected] 400-600-2320 | 北京创新乐知信息技术有限公司 版权所有 | 江苏乐知网络技术有限公司 提供商务支持
  src="http://zz.csdn.net/bin/logs.php" frameborder="0" width="0" height="0">

更多相关文章

  1. Android官方命令深入分析之bmgr
  2. Android安装软件提示:“INSTALL_FAILED_DEXOPT”的解决方案
  3. Android(安卓)异步更新UI----handler+thread
  4. Android(安卓)数据库的简单使用
  5. android volatile的使用
  6. Android(安卓)彻底关闭WebView,防止WebView造成OOM
  7. Android: 如何打开assets or raw文件夹下的数据库文件
  8. Android并发修改异常:java.util.ConcurrentModificationException
  9. Android(安卓)应用安装过程分析

随机推荐

  1. java android 获取手机操作系统相关信息
  2. android 跳转并传递参数
  3. android通知栏响应事件
  4. Android获取GPS进行定位的工具类
  5. android listview 滚动时异步加载图片的
  6. Android之File内部存储和File外部存储
  7. android studio 55[2]线程更新UI handler
  8. 记一次BottomNavigationView使用踩坑
  9. android opengl es 混合效果
  10. Android(安卓)从后台进入前台