本系列博文 基因而前微信高级工程师张绍文专栏 《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系统上,最近笔者的苹果手机也由于物理内存不足,卡顿现象明显。
有些朋友在内存优化的时候,老是以为内存占有越低越好,实则否则。
假设手机的内存无限大,全部界面图片都不须要回收,这时你切换界面就能达到秒加载的体验.这种体验天然是最好的。
固然内存无限大是不存在的,但也反应了一点,内存使用高的时候性能会更好。
咱们应该秉承着“用时分配,及时释放”的理念来优化内存。
在说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内存测量
设备分级或者说内存分级
简单来讲就是高内存,新手机效果全开.老爷机便宜货保留基本功能。
device-year-class是facebook开源的一个库.该库会根据手机的内存,CPU核心数和频率
得出手机属于那个年份。
而咱们也能够根据这个年份来判断,效果全开仍是保留基本功能。
补充部分:
一个空进程也会占用10MB的内存,因此对于一些低端机就不要开太多进程了
安装包中的代码、资源、图片以及 so 库的体积,跟他们占用的内存有很大关系。
因此apk优化仍是有必要的。
Bitmap优化
统一图片库,主要是为了统一图片的调用入口.内存不足的时候能够下降图片格式,选用更合理的缩放算法。
另一点,张老师在课中提到须要作图片监控,通常为了针对大图片和重复图片。(关于这方面,我也接触的很少,就不误导你们了。)
内存泄漏
内存泄漏主要分两种状况,一种是同一个对象泄漏,还有一种是每次都会泄露新的对象。
最后,给本身公众号打个广告,【码农的唠叨】聊技术,聊热文,聊互联网趣事,也发唠叨