- 使用AndroidStudio内置的AndroidProfiler进行内存监控分析:
单击定位某个时间点的内存状态
点击左上角DumpJavaHeap按钮,生成内存记录文件
在下方面板查看分析结果,可以浏览所有类和实例占用的内存大小 - 出现内存泄漏的场景情形:
集合类引用对象
静态变量/单例对象引用对象
非静态内部类/匿名内部类引用对象
资源未关闭 - 防止内存泄漏,内存溢出的方法:
对大图片进行压缩(减少像素,降低颜色质量)后再加载
条件允许的情况下,对图片及时进行回收
在适当情景下,使用软引用弱引用来替代强引用
集合中不再使用的对象,及时remove
不再使用的对象,手动设置为null,提高被回收几率
不要在子线程或者静态变量中引用Activity
在Activity中使用静态内部类来代替内部类,因为非静态内部类会依赖于Activity
在允许的情况下,使用ApplicationContext代替ActivityContext,这样可以降低Activity被强引用的几率
对于需要频繁加载的图片(如ListView,RecyclerView,GridView中,加载网络图片等),使用缓存或多级缓存
对于需要频繁使用的对象(如ListView的Item,ViewPager中的Fragment,线程,数据库连接等),使用对象池技术复用对象
大量的字符串拼接,使用StringBuilder或StringBuffer来代替字符串相加
对于需要关闭销毁解绑的对象,要及时关闭销毁解绑(如Stream,Cursor,WebView,Receiver等)
优化Layout嵌套结构,避免产生多余的View
使用AndroidProfiler来监控内存泄漏 - 其它性能优化方法:
使用重用布局,使用减少布局层级,使用延迟加载
自定义组件时,不要在onDraw方法中频繁创建对象,经常使用的对象,在构造方法中一次性创建
在ListView等组件中,复用itemView,避免每次都创建View,使用ViewHolder,避免每次都findViewById
使用RecyclerView等优化过的控件,来代替ListView
在ListView/RecyclerView/GridView等控件中,如果数据源过大,考虑异步加载和分页加载
避免过度创建对象
尽量不要使用枚举类
常量使用static和final来修饰
使用Android优化过的数据结构(SparseArray等)
对需要频繁加载的网络资源,使用磁盘缓存和内存缓存
在Gradle中使用minifyEnabled和shrinkResources来精简无用的代码和资源 - ANR定义:
ANR即Application Not Responding,应用程序无响应,本质上即是一个超时监听 - ANR触发条件:
KeyEvent:5秒内未处理完成
BroadcastReceiver:10秒内未处理完成
Service:20秒内未处理完成 - ANR避免方法:核心点就是不要在主线程中执行耗时较长的操作
文件操作,数据库操作,网络操作,硬件操作,解压图片操作,长时间任务,都要放到子线程中取执行,执行完毕通过Handler更新UI
BroadcastReceiver和Service也是运行在主线程中,也要开启子线程来执行长耗时操作
不要在主线程中使用可能产生阻塞的代码,比如sleep,wait,lock,future.get等
【Android】【性能优化】内存优化 性能优化 ANR预防
关注
打赏
