一.泄露发生在那个区
除了程序计数器外,虚拟机内存的其他几个运行时区域都会发生OutOfMemoryError(OOM0)
1.Java堆溢出
List<BannerConfig> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < 100000000; i++) {
list.add(new BannerConfig());
}
}
报错日志:java.lang.OutOfMemoryError: Failed to allocate a 186909536 byte allocation with 8388608 free bytes and 25MB until OOM, target footprint 384072200, growth limit 402653184
2.虚拟机栈和本地方法栈溢出
如果线程请求的栈深度大于虚拟机所允许的最大深度 将抛出StackOverflowError异常
如果虚拟机无法申请到足够的内存空间,则抛出OutOfMemoryError异常
3.方法区和常量池溢出
运行时常量池是方法区的一部分
二.GC回收
1.GC主要的回收对象是java堆和方法区,内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;栈中的栈帧随着方法的进入和退出而有条件的执行出栈和入栈的操作。每个栈帧中分配多少内存基本是在类结构确定下来时就已知的。在这个区域不需要过多的考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了。
三,Leakcanary检测和解决
因篇幅问题不能全部显示,请点此查看更多更全内容