1.设备分级
使用类似device-year-class的策略对设备分级,对于低端机用户可以关闭复杂的动画,或者是某些功能。
2.Bitmap优化
方法一:统一图片库 可以使用Glide,Picasso,Fresco,而且需要进一步将所有BitMap。createBitmap,BitmapFactory相关的接口也一并收拢
方法二:统一监控
1.大图片监控:监测某张图片内存占用是否过大,图片比列是否超过屏幕大小,出现图片的“超宽率”
2.重复图片监控:Bitmap的像素数据一致,但是有很多不同的对象存在,这个监控不需要太多的样本量,一般在内部使用
3.监控图片总内存:通过收拢图片使用,统计应用所有图片分析占用内存,在出现OOM崩溃的时候输出图片占用总内存,Top N图片内存日志,帮助排查问题
3.内存泄漏
内存泄漏简单来说就是没有回收,排查和解决内存泄漏也是内存优化无法避开的工作之一
内存泄漏主要分2种情况:1.同一个对象泄漏 2.每次泄漏一个新的对象,可能回出现很多个无用的对象
监测方法:1.Java内存泄漏:建立类似LeakCanary自动化监测
2.OOM监控:美团Android内存泄漏自动化链路分析组建Probe 暂时不成熟,可能引起二次崩溃
3.针对无法重编so的情况
4.针对可重编的情况
内存监控
通过监控拿到内存分配的次数和大小,以及GC发起的次数
//6.0以前
long allocCount=Debug.getGlobalAllocCount();
long allocSize=Debug.getGlobaAllocSize();
long gcCount=Debug.getGlobaGcInvocationCount();
//6.0以后
//运行GC的次数
Debug。getRuntimeStat("art.gc.gc-count");
//GC 使用的总耗时 单位毫秒
Debug.getRunTimeStat("art.gc.gc-time");
//阻塞式的次数
Debug.getRunTimeStat("art.gc.blocking-gc-count");
//阻塞式GC总耗时
Debug.getRunTimeStat("art.gc.blocking-gc-time");