android 内存泄漏那些事

求知若饥,谦卑若愚.........

内存泄漏是开发者会犯的一个主要错误,内存泄漏指的是,一个不再被使用的对象被另外一个还存活的对象引用着。在这种情况下,垃圾回收器会调过他,因为这种引用关系会让未使用的对象继续留在内存中。

一.数据类型

数据类型是所有应用程序的基础,了解如何使用它们非常重要,虽然看起来没有什么特别的,但是也很重要。

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);



猜你喜欢

转载自blog.csdn.net/qq_36275193/article/details/80137229