- 合理设置应用的minSdkVersion和targetSdkVersion,使应用能够运行在更多设备上,这能够进步内存运用功率。
- 防止在Application和Activity的onCreate办法中做过多作业,这会占用过多内存。能够将不必要的初始化作业放到onStart或推迟加载。
- 防止在UI线程中进行过多作业,能够运用AsyncTask或许Thread履行耗时操作,防止ANR问题发生。
- 重用已有目标,防止重复创立目标,这会产生很多废物目标,增加GC负担。能够运用目标池技术重用目标。
- 优化布局,减少视图层级,能够经过merge标签减少不必要的ViewGroup。过多View会增加内存占用。
- 防止运用过多大图,能够加载适宜大小的图片,并运用图片缓存技术,只在列表滑动到可视区域时才加载图片,这能够减少不必要的图片内存占用。
- 监测和剖析内存运用情况,能够运用ADB的dumpsys meminfo指令检查应用内存运用,并根据陈述查找内存占比较大的模块进行优化。也能够运用LeakCanary等内存走漏检测工具监测内存走漏情况。
- 及时开释资源,在Activity和Fragment的onDestroy办法中及时开释资源,防止长时间占用内存。对Bitmap等资源调用recycle办法进行收回。
- 将数据存储在SQLite数据库中,而不是将很多目标存储在内存中,这能够大大减少内存占用。但也要注意数据库本身也会占用一定内存。
- 优化自定义View,自定义View也要遵从上述内存优化原则,尽量重用资源,减少创立目标的次数等。
Android开发中简单形成内存走漏的场景主要有:
- 静态变量持有Activity实例。这会使Activity无法被收回,导致内存走漏。应防止静态变量持有Activity实例的引证。
- 非静态内部类持有外部类实例。非静态内部类会隐式持有外部类的引证,这也会导致外部类无法收回。应防止非静态内部类,或显式使内部类的引证为弱引证。
- 线程运行时未开释资源。假如线程运行过程中创立了目标但未及时开释,当线程结束后这些目标也无法被收回,导致内存走漏。应在线程结束前开释一切资源。
- 调集中保存了不再需求的目标引证。假如调集中保存了不再需求的目标引证,这些目标也无法被收回,应及时从调集中移除不需求的目标引证。
- 未调用Bitmap的recycle()办法。Bitmap是占用内存较大的目标,假如未调用recycle()开释,会形成较大的内存走漏。应在Bitmap不再需求时调用recycle()办法进行收回。
- 注册了播送接收器但未 unregister。注册后的播送接收器会持有注册者的引证,假如未调用unregister刊出,该引证也无法被收回。应在需求时注册,不需求时刊出播送接收器。
- WebView未removeJavascriptInterface或开释。WebView也是较占内存的组件,假如长时间保存WebView实例会导致内存走漏,应在WebView不需求时removeJavascriptInterface并销毁WebView。
防止内存走漏的关键是及时开释不再需求的资源,特别是生命周期较长的资源。在Activity和Fragment的生命周期办法中开释这些资源,如onDestroy()办法中开释线程、调集等引证,防止这些资源的生命周期过长导致内存走漏。
同时,也能够运用LeakCanary等内存走漏检测工具监测内存走漏情况,定期剖析并修复问题,这在开发过程中也是很有必要的。