内存泄露
每个应用可以使用多大内存
由属性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,导致内存忽大忽小。
网友评论