内存泄漏
Java一个非常重要的优点就是垃圾回收机制,但如果使用不当的话,很容易引发内存泄漏问题。
Java内存回收机制:只有当某个对象不再引用时,它的内存才会被回收,如果某个本该被释放的
对象的引用仍然被持有时,此时内存泄漏就会发生。
引用
Java定义了四种类型的引用:
强引用(Strong)
弱引用(Weak)
软引用(Soft)
虚引用(Phantom)
强引用
最常见的一种,我们所写的代码中大部分都是强引用,如果一个对象具有强引用,那垃圾回收器绝不会回收它。如:1
Object o = new Object();
如果该对象不再使用,需要显式将其置为null1
o = null;
软引用
当存在足够的内存保存对象时,垃圾收集器不会回收,只有当内存不足时才会被GC回收,适合用于设计Cache。
弱引用
一旦GC的时候发现了某个对象是弱引用,就会被回收,不管现在内存是否足够;适合应用于映射,这种映射可以自动删除不再被引用的键(如WeakHashMap)
通常用于在某处保存对象引用,而又不干扰该对象被GC回收,通常用于Debug、内存监视工具等程序中。因为这类程序一般要求即要观察到对象,又不能影响该对象正常的GC过程。
虚引用
虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
常见情形
屏幕旋转
常用方法或工具
StrictMode类
Android3.0以上:
1、Activity泄漏
2、其他对象泄漏
3、对象未关闭造成的泄漏(如游标,输入输出流等所有实现Closeable接口的类)
以下是示例代码实现(记得只在开发和调试中使用):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class MyApplication extends Application {
public static final boolean DEBUG_MODLE = true;
@Override
public void onCreate() {
super.onCreate();
if(DEBUG_MODLE){
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
builder.detectAll();
builder.penaltyLog();
// builder.penaltyDeath();
StrictMode.VmPolicy vmp = builder.build();
StrictMode.setVmPolicy(vmp);
}
}
}
OnLowMemory&OnTrimMemory
OnLowMemory是Android提供的API,所有后台程序(优先级为background的进程,不是指后台运行的进程)都被杀死时,在系统内存还不足时,系统会调用OnLowMemory。
OnTrimMemory是Android 4.0之后提供的API,系统会根据不同的内存状态来回调。根据不同的内存状态,来响应不同的内存释放策略。
以下几点是我们常常要考虑释放的资源:
缓存或缓存条目(如使用强引用的LruCache)
可以再次按需生成的位图对象
不可见的布局对象
数据库对象
TraceView
先找瓶颈,再优化代码,物尽其用
电量篇
禁用和启用广播接收器
数据传输
1、检查是否允许后台传输数据1
2
ViewStub
复杂布局在代码中展开