内存性能对比
image.png内存分配以及问题出现区域
image.png- 内存造成的两个主要问题:异常、卡顿
内存理解误区
-
内存占用越少越好
- 应用是否占用了过多内存,跟设备、系统和当时情况有关,而不是具体的数值300MB、200MB等。尽可能做到用的时候分配、用完即时释放即可。
-
Android 内存分配发展史
既然8.0以后重新将 Bitmap内存放入到了Native中,那么是不是可以随便滥用图片了呢?
-
答案是否定的。如果手机物理内存不足,那么lmk便会开始杀进程,从后台、桌面、服务、前台、直到手机重启。
-
lmp杀进程的顺序
image.png -
low memory killer设计,是假定我们都遵守安卓规范。但是很多App都是杀不死的小强,杀了还会自动起进程,最终导致server卡死。
-
8.0之前的5.0-7.0的系统如何把Bitmap内存放到Native内存中呢?
// 步骤一:申请一张空的 Native Bitmap
Bitmap nativeBitmap = nativeCreateBitmap(dstWidth, dstHeight, nativeConfig, 22);
// 步骤二:申请一张普通的 Java Bitmap
Bitmap srcBitmap = BitmapFactory.decodeResource(res, id);
// 步骤三:使用 Java Bitmap 将内容绘制到 Native Bitmap 中
mNativeCanvas.setBitmap(nativeBitmap);
mNativeCanvas.drawBitmap(srcBitmap, mSrcRect, mDstRect, mPaint);
// 步骤四:释放 Java Bitmap 内存
srcBitmap.recycle();
srcBitmap = null;
- 虽然上面的方法能实现低版本系统的手机内存转移,但是也有两个问题,一个是兼容性问题,另一个是频繁申请Java Bitmap容易造成内存抖动
内存优化方法
- 设备分级
根绝手机年限不同,内存大小不同。推出不同版本,如今日头条和今日头像极速版。减少进程数等等 - Bitmap优化
- 统一图片库、统一监控。如使用Glide、Fresco或者自研都可以。Bitmap.createBitmap、BitmapFactory等接口方法统一。监控的话大图监控和重复图片监控
- 内存泄漏
- 建立类似于LeakCanary自动化监测方案,至少实现Activity和Fragment的内存泄漏监控
- OOM监控,可以使用美团的Probe进行监控,不过线上使用风险较大。在崩溃的时候生成内存快照有可能造成二次崩溃
http://ppt.geekbang.org/slide/download/876/593bc30c21689.pdf/19 - Native内存泄露监控。
http://mp.weixin.qq.com/s/KtGfi5th-4YHOZsEmTOsjg
网友评论