v8堆内存分析
Node.js 内存分析
工具
heapdump
heapdump 可以使用来将 v8 引擎的堆内存内容dump出来,这样你就可以在 Chrome 的开发者工具中查看问题。
发送信号 kill -USR2 <pid>
后会生成一个内存的快照。导入开发者工具中就能查看了。
memwatch
这个可以在代码里直接使用,实时检测内存动态,当发生内存泄漏的时候,会触发 leak
事件,会传递当前的堆状态,配合 heapdump 有奇效。
1 | const memwatch = require('memwatch'); |
devTool
安装 npm install -g devtool
可以在 devtool 分析 dump 出来的内存信息,也可以使用 devtool 来调试代码。直接 devtool app.js
运行代码。
堆快照提供了不同的视角来进行查看:
- Summary 该视图按照构造函数进行分组,用它可以捕获对象和它们使用的内存情况,对于跟踪定位DOM节点的内存泄漏特别有用。
- Comparison 对比两个快照的差别,用它可以对比某个操作前后的内存快照。分析操作前后的内存释放情况以及它的引用计数,便于你确认内存是否存在泄漏以及造成的原因。
- Containment 该视图可以探测堆的具体内容,它提供了一个更适合的视图来查看对象结构,有助于分析对象的引用情况,使用它可以分析闭包和进行更深层次的对象分析。
- Statistics 统计视图。
1 | require('heapdump'); |
更详细的介绍可以查看Take Heap Snapshot 简介
GC
在启动时加上 --trace_gc
或者 --trace_gc_nvp
后每次垃圾回收时都会打印出GC日志。这两日志的格式不太相同。
node –v8-options | grep gc
GC简介
GC日志
1 | [11631:0x102001c00] 7 ms: Scavenge 2.1 (6.0) -> 2.1 (7.0) MB, 0.5 / 0.0 ms [allocation failure]. |
上面日志的
V8内存结构图
配置参数
node –v8-options | grep space1
2--max-old-space-size
--max-new-space-size
参考
http://zhuchenglin.me/chrome-devtools-in-depth-4
http://alinode.aliyun.com/blog/37
http://alinode.aliyun.com/blog/38
https://yq.aliyun.com/articles/25476
http://www.open-open.com/lib/view/open1421734578984.html
http://zhuchenglin.me/chrome-devtools-in-depth-4
http://www.barretlee.com/blog/2015/10/07/debug-nodejs-in-command-line/
https://my.oschina.net/lgmcolin/blog/121434
https://blog.eood.cn/node-js_gc
http://frontenddev.org/link/nodejs-web-service-smooth-upgrade.html
https://blog.eood.cn/node-js_gc
http://sentsin.com/web/138_7.html
http://zhuchenglin.me/performance-optimization-in-action
http://www.itread01.com/articles/1475289787.html
https://segmentfault.com/a/1190000002429825
http://taobaofed.org/blog/2016/04/15/how-to-find-memory-leak/
https://www.w3ctech.com/topic/842
http://taobaofed.org/blog/2016/04/15/how-to-find-memory-leak/
http://deadhorse.me/nodejs/2013/04/13/exception_and_domain.html
https://eggjs.org/zh-cn/core/logger.html
https://eggjs.org/zh-cn/advanced/loader.html