摘要:现象有一个方法逻辑如下分批查询的数据每次条做一些处理后修改状态表示已经处理过了递归调用直到查不出数据来发现当数据量大的时候如有几万条数据待处理很容易发生内存溢出的问题觉得很奇怪不是每次限制只查条吗怎么还会有内存溢出的问题呢假设递归调用不会释
现象
有一个方法 逻辑如下
分批查询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
摘要:回调函数执行几乎所有的回调函数,除了关闭回调函数,定时器计划的回调函数和。轮询此阶段有两个主要的功能执行已过时的定时器脚本处理轮询队列中的事件。一旦轮询队列为空,事件循环将检查已达到时间阈值的定时器。 什么是事件循环(Event Loop)? 事件环使得Node.js可以执行非阻塞I/O 操作,只要有可能就将操作卸载到系统内核,尽管JavaScript是单线程的。 由于大多数现代(终端...
摘要:检索新的事件执行与相关的回调几乎所有,除了由定时器调度的一些和将在适当的时候在这里阻塞。在事件循环的每次运行之间,检查它是否在等待任何异步或定时器,如果没有,则彻底关闭。 Node.js事件循环、定时器和process.nextTick() 什么是事件循环? 事件循环允许Node.js执行非阻塞I/O操作 — 尽管JavaScript是单线程的 — 通过尽可能将操作卸载到系统内核。 ...
摘要:如果一个即时定时器是被一个正在执行的回调排入队列的,则该定时器直到下一次事件循环迭代才会被触发。参数描述在事件循环的当前回合结束时要调用的函数。事件轮询随后的调用,会在任何事件包括定时器之前运行。 系列文章 Nodejs高性能原理(上) --- 异步非阻塞事件驱动模型Nodejs高性能原理(下) --- 事件循环详解 前言 终于开始我nodejs的博客生涯了,先从基本的原理讲起.以前写...
摘要:函数式编程的哲学就是假定副作用是造成不正当行为的主要原因。函数组合面向对象通常被比喻为名词,而函数式编程是动词。尾递归优化函数式编程语言中因为不可变数据结构的原因,没办法实现循环。 零、前言 说到函数式编程,想必各位或多或少都有所耳闻,然而对于函数式的内涵和本质可能又有些说不清楚。 所以本文希望针对工程师,从应用(而非学术)的角度将函数式编程相关思想和实践(以 JavaScript 为...
阅读 2158·2021-09-22 10:56
阅读 1465·2021-09-07 10:11
阅读 1801·2019-08-30 15:54
阅读 2290·2019-08-30 15:44
阅读 2307·2019-08-29 12:40
阅读 3031·2019-08-28 18:25
阅读 1735·2019-08-26 10:24
阅读 3186·2019-08-23 18:39