资讯专栏INFORMATION COLUMN

递归调用 VS 循环调用

Awbeci / 1549人阅读

摘要:现象有一个方法逻辑如下分批查询的数据每次条做一些处理后修改状态表示已经处理过了递归调用直到查不出数据来发现当数据量大的时候如有几万条数据待处理很容易发生内存溢出的问题觉得很奇怪不是每次限制只查条吗怎么还会有内存溢出的问题呢假设递归调用不会释

现象

有一个方法 逻辑如下

分批查询state=0的数据 每次500条

做一些处理后 修改state状态 state=0 ==> state=1 表示已经处理过了

递归调用 直到查不出数据来

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

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

证明

@Test
public 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 1048576
java.lang.OutOfMemoryError: Java heap space

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

解决
改成循环调用即可

@Test
public 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 此时可以无限执行下去

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71096.html

相关文章

  • Node.js中的事件循环(Event Loop),计时器(Timers)以及process.nex

    摘要:回调函数执行几乎所有的回调函数,除了关闭回调函数,定时器计划的回调函数和。轮询此阶段有两个主要的功能执行已过时的定时器脚本处理轮询队列中的事件。一旦轮询队列为空,事件循环将检查已达到时间阈值的定时器。 什么是事件循环(Event Loop)? 事件环使得Node.js可以执行非阻塞I/O 操作,只要有可能就将操作卸载到系统内核,尽管JavaScript是单线程的。 由于大多数现代(终端...

    KoreyLee 评论0 收藏0
  • Node.js 指南(Node.js事件循环、定时器和process.nextTick())

    摘要:检索新的事件执行与相关的回调几乎所有,除了由定时器调度的一些和将在适当的时候在这里阻塞。在事件循环的每次运行之间,检查它是否在等待任何异步或定时器,如果没有,则彻底关闭。 Node.js事件循环、定时器和process.nextTick() 什么是事件循环? 事件循环允许Node.js执行非阻塞I/O操作 — 尽管JavaScript是单线程的 — 通过尽可能将操作卸载到系统内核。 ...

    pingink 评论0 收藏0
  • Nodejs高性能原理(下) --- 事件循环详解

    摘要:如果一个即时定时器是被一个正在执行的回调排入队列的,则该定时器直到下一次事件循环迭代才会被触发。参数描述在事件循环的当前回合结束时要调用的函数。事件轮询随后的调用,会在任何事件包括定时器之前运行。 系列文章 Nodejs高性能原理(上) --- 异步非阻塞事件驱动模型Nodejs高性能原理(下) --- 事件循环详解 前言 终于开始我nodejs的博客生涯了,先从基本的原理讲起.以前写...

    newsning 评论0 收藏0
  • JavaScript 函数式编程(一)

    摘要:函数式编程的哲学就是假定副作用是造成不正当行为的主要原因。函数组合面向对象通常被比喻为名词,而函数式编程是动词。尾递归优化函数式编程语言中因为不可变数据结构的原因,没办法实现循环。 零、前言 说到函数式编程,想必各位或多或少都有所耳闻,然而对于函数式的内涵和本质可能又有些说不清楚。 所以本文希望针对工程师,从应用(而非学术)的角度将函数式编程相关思想和实践(以 JavaScript 为...

    hoohack 评论0 收藏0
  • 最强函数学习之路

    摘要:无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。形式参数当函数调用完成之后就自动销毁了。函数的声明一般出现在函数的使用之前。函数的声明一般要放在头文件中的。 索引: 一. 函数是什么 二. 库函数 三. 自定义函数  函数参数 四 函数的...

    _Dreams 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<