求知若饥,谦卑若愚.........
内存泄漏是开发者会犯的一个主要错误,内存泄漏指的是,一个不再被使用的对象被另外一个还存活的对象引用着。在这种情况下,垃圾回收器会调过他,因为这种引用关系会让未使用的对象继续留在内存中。
一.数据类型
数据类型是所有应用程序的基础,了解如何使用它们非常重要,虽然看起来没有什么特别的,但是也很重要。
Java所提供的数据类型,在使用时需要被保存在内存中,系统根据不同的数据类型分配相应的内存。
byte: 8 bit
short: 16 bit
int: 32 bit
long: 64 bit
float: 32 bit
double: 64 bit
char: 16 bit
所以选择合适的数据类型很重要,可以使用int的就尽量不要使用 long,float或者double。
Integer i =0; 等同于 Integer i = new Integer(0);
Integer 对象16 byte的内存空间 但是 int 只需要 32 bit;
所如果使用的是基本数据类型,而并非使用它的包装类,那么这些操作的速度回更快。
二. ArrayMap
ArrayMap 对象时 Android 对Map 接口的一个实现,它比HashMap 更加内存高效。
三.枚举
枚举一般和switch...case 语法使用。来看看下发所示的枚举用法。
public enum SHAPE {
A,
B,
C,
}
public void myTest(SHAPE shape){
switch (shape){
case A:
// 这是A
break;
case B:
// 这是B
break;
case C:
// 这是C
break;
}
}
效果却不如
private final int A = 1;
private final int B = 2;
private final int C = 3;
public void myTest(){
switch (shape){
case A:
// 这是A
break;
case B:
// 这是B
break;
case C:
// 这是C
break;
}
}
四:常量
我们经常会需要一个变量,可以在整个APP中使用,即 静态变量,静态变量对内存有什么影响呢?静态变量在应用程序启动时就被初始化了,但是如果 静态变量还有final关键字,就会带来2个好处,既不需要更多的内存分配,也不需要额外的操作对它分配,但这仅仅适用于基本数据类型和常量。
五:Acticity 导致内存泄漏
一个不再被引用的Activity,如果仍然驻留在内存中,将会带来很大的代价,Activity关联着大量的其它对象,如果Activity 本身不能被回收,那么这些对象也不能被回收。那么Activity的泄漏是怎么造成的呢?
1.静态字段
2.非静态内部类
3.单列模式
4.匿名内部类
5.handler
举个列子
如设置一个接口
setDataCallback(this)
会导致内存泄漏
setDataCallbake(new DataCallback(){
@Override
public void onData(String data){
}
});
依然会导致内存泄漏
所以需要在Activity被销毁时 setDataCallback(null);
Handler 导致的内存泄漏不易被察觉。
如handler 里的延时发送消息,导致Activity 被销毁时延时依然存在,所以要在Activity被销毁时,removeCallbacksAndMessages(null);
六. service导致的内存泄漏
在service所做的任务完成时,需要停止服务,
service.stopSelf();
外部可调用 Context.stopService();
检测自己的代码有没有内存泄漏可以使用 leakcanary工具
在build中添加如下依赖:
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
在Application 中调用初始化方法
if (LeakCanary.isInAnalyzerProcess(this)) { return; } LeakCanary.install(this);