heapdump
可用于V8的堆内存快照记录,我们可以通过使用该模块来查看node服务运行时内存的使用情况,排查内存泄漏的问题。我在windows环境下安装时,并不是一次性成功,在此记录下安装成功的步骤。
一、安装
执行命令:
npm install heapdump
1.报 Can’t find Python executable “python” 相关的错误
如:stack Error: Can't find Python executable "python", you can set the PYTHON env variable.
。
这是因为在Windows上,需要安装一些构建工具(包括python)。以管理员的身份打开CMD运行以下代码:
npm install --g --production windows-build-tools
该命令是一键安装环境,自动安装:
- python(v2.7 ,3.x不支持)
- visual C++ Build Tools,或者 (vs2015以上(包含15))
- .net framework 4.5.1
这样就省去了我们很多自己安装这些环境的麻烦。
2.报 if not defined npm_config_node_gyp 相关的错误
这是由于缺少了node-gyp
组件,由于node程序中需要调用一些其他语言编写的工具甚至是dll,需要先编译一下,否则就会有跨平台的问题,例如在windows上运行的软件copy到mac上就不能用了,但是如果源码支持,编译一下,在mac上还是可以用的。node-gyp
在较新的Node版本中都是自带的(平台相关),用来编译原生C++模块。
运行以下代码安装:
npm install -g node-gyp
再把安装的包添加到全局npm配置中(你也可以直接找到自己本机的.npmrc
文件进行编辑):
npm config set node_gyp "node 你的全局npm包路径\node_modules\node-gyp\bin\node-gyp.js"
//上述的方法不行的话,换成下面这条
npm config set npm_config_node_gyp "node 你的全局npm包路径\node_modules\node-gyp\bin\node-gyp.js"
修改后的结果如下:
运行命令检查是否成功:
node-gyp list
安装成功:
二、使用
在项目中添加内存快照获取的代码:
const heapdump = require('heapdump')
function showMemory() {
function f(v) {
if (v < 1024) {
return v.toString(10)
} else if (v < 1048576) {
return (v / 1024).toFixed(2) + "KB" //1KB
} else if (v < 1073741824) {
return (v / 1048576).toFixed(2) + "MB" //1M
} else {
return (v / 1073741824).toFixed(2) + "GB" //1G
}
}
//打印并显示当前堆的情况 可以去掉这个部分
let d = process.memoryUsage()
let strRss = f(d.rss)
let strheapTotal = f(d.heapTotal)
let strheapUsed = f(d.heapUsed)
let strDate = new Date().toLocaleString()
console.log(`memory: ${strDate}: rss:${strRss}, heapTotal:${strheapTotal}, heapUsed:${strheapUsed}`,)
//堆快照必须.heapsnapshot,否则在后面使用chrome的时候,会报错。
heapdump.writeSnapshot(`d:/tmp/dump/${Date.now()}.heapsnapshot`);
}
setInterval(showMemory, 30000)
这里需要注意heapdump.writeSnapshot
函数中的路径,例子中是d:/tmp/dump/
,你需要确保该路径的存在(也就是要自己创建相应的文件夹),否则将不会生成快照文件,它不会自己创建该路径。再者,快照的文件要以.heapsnapshot
作为文件后缀名,要不然chrome浏览器识别不了。
然后启动项目,过一会到相应目录下即可看到生成的文件:
然后:
- 打开chrome浏览器的dev tool,选中Memory
- 点击load按钮
- 选择对应的内存快照
- 打开
接着就愉快地进行分析啦:
你也可以通过添加两个内存快照进行对比,来查看内存的变化情况:
本文参考的资料: