读书笔记2-内存优化篇

本系列博文 基因而前微信高级工程师张绍文专栏 《Android开发高手课》的读书笔记。java

文章所写内容是本人读完的感悟,须要原文的朋友请自行购买。android

内存优化篇

写在开头.git

越读张老师的课,越会发现有不少知识彻底没有接触过,课程的留言下方也有不少人反应说课程有点深。github

秉持着"你们好才是真的好"的理念,以后的笔记都会记录一些你们容易理解的内容,算法

至于有些设计比较深的内容,一笔带过。有兴趣的朋友能够自行了解。shell

手机运行内存(RAM)做为 App 运行过程当中临时性数据暂时存储的内存介质,由于体积和功耗的缘由,没有直接采用PC上DDR的架构,而是该用LPDDR,能够理解为Lower PowerDDR.性能优化

内存不足所带来的问题

1.**异常:**其中异常包括OOM、内存分配失败这些崩溃,也包括由于总体内存不足致使应用被杀死、设备重启等问题。微信

2.**卡顿:**Java 内存不足会致使频繁 GC,而GC便会引发卡顿,这个问题在Dalvik 虚拟机比较明显,而ART虚拟机在内存管理跟回收策略上都作大量优化,因此卡顿现象没那么严重。架构

若是想要测试GC的性能,能够经过adb命令获取ANR日志.性能

//adb 命令
adb shell kill -S QUIT PID
adb pull /data/anr/traces.txt

//ANR日志
sticky concurrent mark sweep paused:	Sum: 5.491ms 99% C.I. 1.464ms-2.133ms Avg: 1.830ms Max: 2.133ms     // GC 暂停时间

Total time spent in GC: 502.251ms     // GC 总耗时
Mean GC size throughput: 92MB/s       // GC 吞吐量
Mean GC object throughput: 1.54702e+06 objects/s 

复制代码

除了频繁GC会形成卡顿以外,物理内存不足时系统会触发low memory killer 机制,进而影响手机性能。

关于物理内存不足引发的卡顿现象,不仅发生在android系统上,最近笔者的苹果手机也由于物理内存不足,卡顿现象明显。

内存优化的两大误区

1.内存占用越少越好

有些朋友在内存优化的时候,老是以为内存占有越低越好,实则否则。

假设手机的内存无限大,全部界面图片都不须要回收,这时你切换界面就能达到秒加载的体验.这种体验天然是最好的。

固然内存无限大是不存在的,但也反应了一点,内存使用高的时候性能会更好。

咱们应该秉承着“用时分配,及时释放”的理念来优化内存。

2.Native内存不用管

在说Native内存以前,先来谈一谈常见的OOM。

Android系统会给每个进程分配一个最大java堆.若是该进程申请的空间超过这个阈值时,就会抛出OOM异常。

因此程序发生OMM并不表示RAM(物理内存)不足

这样设计的目的是为了让Android系统能同时让比较多的进程常驻内存(RAM)。

Native内存起到什么做用?

拿常见的例子来讲明,你们都知道android的内存大户是bitmap,OOM出现也可能是由于图片。

  • 在Android3.0以前,Bitmap对象放在java堆中,具体的像素数据放在Native中,这样作OOM的概率小了,但在图片回收的时候,不必定能及时释放Native内存中的图片像素数据。

  • 因而在Android3.0~Android7.0期间,将Bitmap 对象和像素数据统一放到 Java 堆中.这样作资源是能及时回收了,可是OOM的问题又出现了。

  • Android8.0系统又以为将Bitmap像素数据放回到Native中,只是这时多了一个NativeAllocationRegistry来帮助Native内存的回收。

那么8.0系统以后的手机性能优化对图片部分是否是就没有那么必要了呢?毕竟图片像素数据放入到Native以后就不太会引发OOM。

固然也不是,虽然说OOM的概率小了,但没有回收的图片依旧占用着RAM,当RAM不够的时候,手机会开启

low memory killer 杀戮模式,后台,桌面,服务,前台,直至手机重启。

因此该回收的内存仍是得回收的,若是由于手机内存不足致使手机卡顿,删点图片,腾出点空间仍是有效果的。

java内存和Native内存的测量方法

java内存测量

  • Allocation Tracker
  • MAT

Native内存测量

如何着手内存优化

  1. 设备分级或者说内存分级

    简单来讲就是高内存,新手机效果全开.老爷机便宜货保留基本功能。

    device-year-class是facebook开源的一个库.该库会根据手机的内存,CPU核心数和频率

    得出手机属于那个年份。

    而咱们也能够根据这个年份来判断,效果全开仍是保留基本功能。

    补充部分:

    • 一个空进程也会占用10MB的内存,因此对于一些低端机就不要开太多进程了

    • 安装包中的代码、资源、图片以及 so 库的体积,跟他们占用的内存有很大关系。

      因此apk优化仍是有必要的。

  2. Bitmap优化

    统一图片库,主要是为了统一图片的调用入口.内存不足的时候能够下降图片格式,选用更合理的缩放算法。

    另一点,张老师在课中提到须要作图片监控,通常为了针对大图片和重复图片。(关于这方面,我也接触的很少,就不误导你们了。)

  3. 内存泄漏

    内存泄漏主要分两种状况,一种是同一个对象泄漏,还有一种是每次都会泄露新的对象。

    最后,给本身公众号打个广告,【码农的唠叨】聊技术,聊热文,聊互联网趣事,也发唠叨

    qrcode_for_gh_5febf245550e_258
相关文章
相关标签/搜索