Node内存泄漏专题
来源:互联网 发布:fmri数据统计分析 编辑:程序博客网 时间:2024/06/17 17:32
收集所有存在内存泄漏的所有case。哪怕一个字节也不放过。
Case1:无限制增长的数组
var leakArray = []; exports.leak = function () { leakArray.push("leak" + Math.random()); };
这个大概是最常见的内存泄漏案例。只要变量leakArray
不被回收,内存就有可能无限上涨,且不被回收。
解决方案
确认你push元素的数组对象是可以随着作用域执行结束回收。
Case2:无限制设置属性和值
这个情形在缓存对象中经常出现:
_.memoize = function(func, hasher) { var memo = {}; hasher || (hasher = _.identity); return function() { var key = hasher.apply(this, arguments); return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); };};
memoize方法主要是用来解决昂贵CPU耗用的js运算的。它十分有用。但是在后端使用的时候要十分小心。因为memo对象是不会回收的,每次的参数不同都会在这个对象上添加属性和值。
这个案例中,memo对象被当作了缓存来使用,一直无法得到回收。
解决方案
关于如何规避这种无限制缓存的问题,请移步到我另开的帖子中看解决方案:http://cnodejs.org/topic/4fafc843e7656c60680306f9
Case3:任何模块内的私有变量和方法均是永驻内存的
(function (exports, require, module, __filename, __dirname) { var circle = require('./circle.js'); console.log('The area of a circle of radius 4 is ' + circle.area(4)); exports.get = function () { return circle(); };});
任意编写的模块文件中,均会在头和尾部上添加字符串,以形成闭包,然后在require的过程中被调用一次,并且将exports对象存储在内存中,直到进程退出才会回收。
这个案例中,只是内存不会回收,但一般不会造成内存泄漏。需要注意的是私有变量不要通过exports上的方法为其添加内存占用。
第一个案例其实就是由于这个原因造成的。
Case4: 大循环,无GC机会
第四个案例来自于http://cnodejs.org/topic/4fcd020be5e72c25180032e5。
//OOM测试for ( var i = 0; i < 100000000; i++ ) { var user = {}; user.name = 'outmem'; user.pass = '123456'; user.email = 'outmem@outmem.com';}
这段代码最主要的原因在于循环太大,直接内存分配到超过v8内存限制数量。由于JavaScript事件循环的执行机制,这段代码没有机会进入下一个事件循环。用setInterval和setTimeout可以进入下一个循环。但是不推荐用setInterval和setTimeout。
在Node下有一个特殊的方法,process.nextTick();
for ( var i = 0; i < 100000000; i++ ) { process.nextTick(function () { var user = {}; user.name = 'outmem'; user.pass = '123456'; user.email = 'outmem@outmem.com'; });}
不过这样的效率可能不够好。因为每次都没有效利用好一次循环。
一个建议是,一次事件循环,不要超过10ms。太长时间的事件循环,不仅会存在oom的风险,还会阻塞后续IO的启动。
- Node内存泄漏专题
- 内存泄漏专题分析
- 内存泄漏专题分析
- Node.js内存泄漏分析
- node.js内存泄漏分析二
- Android 内存泄漏---新能优化专题(MAT的使用)
- 内存泄漏。。。
- 内存泄漏
- 内存泄漏
- 内存泄漏
- 内存泄漏
- 内存泄漏
- 内存泄漏
- 内存泄漏
- 内存泄漏
- 内存泄漏
- 内存泄漏
- 内存泄漏
- 第十周 计算1到20的阶乘的和
- linux下数学运算器:expr命令(shell中完成数学运算)
- Android中的PopupWindow详解
- Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
- 删除有序数组中的重复元素 Remove Duplicates from Sorted Array
- Node内存泄漏专题
- 深入理解 Cocos2d-x 内存管理
- OCP-1Z0-053-V12.02-112题
- java 动态代理
- poj 1528 Perfection
- 在 VMware 中安装 HMC
- google gmail google+ google doc 等不能访问的办法
- dynamic-insert,dynamic-update 我有话要说
- 建站策划之seo搜索引擎优化(三)