Android内存泄露和内存溢出总结

一.泄露发生在那个区 

 除了程序计数器外,虚拟机内存的其他几个运行时区域都会发生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检测和解决

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值