美文网首页
Android:内存总结

Android:内存总结

作者: 我在等你回复可你没回 | 来源:发表于2018-08-08 20:53 被阅读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,导致内存忽大忽小。

    相关文章

      网友评论

          本文标题:Android:内存总结

          本文链接:https://www.haomeiwen.com/subject/vtuxbftx.html