node.js内存泄漏分析二
Posted danhuang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js内存泄漏分析二相关的知识,希望对你有一定的参考价值。
概述
在开发过程中,遇到了部分导致内存泄露的情况,本文主要是说明几种内存泄漏的问题,并简单分析一些关于内测泄漏分析的方法。
内存泄漏分析
1. 使用heapdump模块
模块介绍:https://github.com/bnoordhuis/node-heapdump
该模块主要是一个抓取当前内存的快照信息,包括所有的字符,对象和函数所占用内存的情况。
2. 分析原理
根据heapdump抓取的是当前内存的情况,那么如果存在内存泄漏的情况下,对在中间请求时刻抓取内存快照,然后再最后一个请求中抓取快照,那么再分析两者之间的区别,就可以看出内存泄漏的问题。
抓取方法可参考:
var times = 1;
var heapdump = require('heapdump');
/* server start */
global.app = HTTP.createServer(function(req, res)
var d = D.create();
/* error catch */
d.on('error', function(err)
console.error('error, server error', err.message, err.stack);
serverError(res, req, err);
d.dispose();
);
d.run(function()
ROUTER.router(res, req);
);
if(times == 1000 || times == 500)
heapdump.writeSnapshot('/data/danhuang/' + Date.now() + '.heapsnapshot');
times++;
)
3. chrome工具分析
抓取到内存截屏以后,使用chrome的profile功能,load两个对应的headdump文件。load成功以后再使用profile中的comparsion功能,过程如下。
4. 对比分析优化
然后再经过两个截取的内存快照的函数以及对象的对比,就可以很清晰的看出哪些函数存在泄漏,然后再进行修复。
内存泄漏结论
在做的压测时发现存在泄漏,主要包含在两个部分
log4js中的file.js使用数组无限保存对象
settimeout执行导致内存暴涨,尽量不用使用settimeout
protobuf未使用node_modules模块方法,导致每次build
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2mwuyk7ird0ks
以上是关于node.js内存泄漏分析二的主要内容,如果未能解决你的问题,请参考以下文章