Android:内存总结

2018-08-08  本文已影响31人  我在等你回复可你没回

内存泄露

每个应用可以使用多大内存

由属性dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize确定。

内存泄露有哪些场景

主要看生命周期。生命周期不一致就有可能内存泄露。

如何处理内存泄露

匿名内部类的方法为什么是final?

首先,你问题提错了,是局部内部类,方法内部定义的类。

    public static void main(String[] args) {
        final String str = "hapjin";
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for(int i = 0; i < 10; i++)
                    System.out.println(str);
            }
        }).start();
        
        System.out.println("main thread finished");
    }

为什么要final呢?众说纷纭
https://www.cnblogs.com/hapjin/p/5744478.html
这个链接说作用域扩大了,定义成final可以保证值不变,安全。

https://www.cnblogs.com/DarrenChan/p/5738957.html
这个链接直接甩出反编译结果,可以看到局部变量是作为局部内部类的构造函数的。如果不用final,就会存在值不同步的问题。

public interface MyInterface {
    void doSomething();
}


public class TryUsingAnonymousClass {
    public void useMyInterface() {
        final Integer number = 123;
        System.out.println(number);

        MyInterface myInterface = new MyInterface() {
            @Override
            public void doSomething() {
                System.out.println(number);
            }
        };
        myInterface.doSomething();

        System.out.println(number);
    }
}
class TryUsingAnonymousClass$1
        implements MyInterface {
    private final TryUsingAnonymousClass this$0;
    private final Integer paramInteger;

    TryUsingAnonymousClass$1(TryUsingAnonymousClass this$0, Integer paramInteger) {
        this.this$0 = this$0;
        this.paramInteger = paramInteger;
    }

    public void doSomething() {
        System.out.println(this.paramInteger);
    }
}

hprof分析

handler泄露


image.png

this.0就是内部类handler对象,
handler对象被message对象的handler属性应用,而message对象又被MessageQueue对象的mMessage属性引用。而MessageQueue对象又被Looper对象的mQueue属性引用。最后这个Looper对象被sMainLooper静态属性引用。

内存抖动时什么意思

内存抖动时指频繁创建对象和gc,导致内存忽大忽小。

上一篇下一篇

猜你喜欢

热点阅读