博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归调用 VS 循环调用
阅读量:5756 次
发布时间:2019-06-18

本文共 741 字,大约阅读时间需要 2 分钟。

现象

有一个方法 逻辑如下

  • 分批查询state=0的数据 每次500条
  • 做一些处理后 修改state状态 state=0 ==> state=1 表示已经处理过了
  • 递归调用 直到查不出数据来

发现当数据量大的时候 如有几万条数据待处理 很容易发生内存溢出的问题 觉得很奇怪 不是每次限制只查500条吗 怎么还会有内存溢出的问题呢?

假设

递归调用不会释放局部变量 直到方法调用结束

证明

@Testpublic void recursiveCall(){    foo(1);}private void foo(int i){    // 局部变量 占用1M    byte[] a = new byte[1 * 1024 * 1024];    System.out.println(i+" "+a.length);    foo(i+1);}

当指定最大堆内存50M (-Xmx50M)的时候 递归调用到40次左右的时候 便会发生内存溢出异常

40 1048576java.lang.OutOfMemoryError: Java heap space

可知递归调用并未释放变量a的内存占用

解决

改成循环调用即可

@Testpublic void loopCall(){    bar();}private void bar(){    int index = 1;    while (true) {        byte[] a = new byte[1 * 1024 * 1024];        System.out.println(index+" "+a.length);        index ++;    }}

同样设置-Xmx50M 此时可以无限执行下去

转载地址:http://bhvkx.baihongyu.com/

你可能感兴趣的文章
Windows Phone 7 中各种Task解说(启动器与选择器)
查看>>
罗森伯格助力2011年中国智能建筑技术发展应用论坛哈尔滨站
查看>>
网络割接
查看>>
windows server 2016 活动目录(二)
查看>>
openstack G版 修改vm的flavor级别
查看>>
python_控制台输出带颜色的文字方法
查看>>
java泛型中特殊符号的含义
查看>>
一秒 解决 ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql 问题
查看>>
Android组件化最佳实践 ARetrofit原理
查看>>
舍弃浮躁, 50条重要的C++学习建议
查看>>
同步手绘板——将View的内容映射成Bitmap转图片导出
查看>>
【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!...
查看>>
微信小程序之wx.navigateback往回携带参数
查看>>
陌陌和请吃饭之类的应用,你要是能玩转,那就厉害了
查看>>
递归的运行机制简单理解
查看>>
汉字转阿斯克马值
查看>>
Java 栈与堆简介
查看>>
【supervisord】部署单进程服务的利器
查看>>
zabbix oracle监控插件orabbix部署安装
查看>>
python3 通过qq 服务器 发送邮件
查看>>