如何定位Node.js的内存泄漏
发布网友
发布时间:2022-05-10 09:15
我来回答
共1个回答
热心网友
时间:2022-04-22 15:29
一、定位node.js内存漏洞的工具:
工欲善其事必先利其器,在排查时,我们还是需要一些工具来帮忙的。
devTool
这个是今年初出的 Node.js 调试工具,基于 Electron 将 Node.js 和 Chromium 的功能融合在了一起。操作起来比 node-inspector 方便,开放的 Timeline 功能还是比较实用的,虽然不是实时显示。
仅需要 devtool xxx.js,还可以通过 .devtoolrc 来进行参数定制,具体见 GitHub
heapmp + chrome devTool
这个是比较传统的定位内存泄漏的组合。heapmp 可以直接在代码中调用生成内存快照,然后将快照文件导入到 chrome devTool 进行分析,之后操作其实和前者就差不多了。不过,这个方案和前者有一点区别就是,前者实际还是在浏览器环境中,所以生成的内存快照会有一些 DOM 对象的存在,会有一定的干扰。而这个方案,是直接调用底层 V8 的方法,生成的快照只有 Node.js 环境中的对象。
memwatch
这个可以在代码里直接使用,实时检测内存动态,当发生内存泄漏的时候,会触发 ‘leak’ 事件,会传递当前的堆状态,配合 heapmp 有奇效。
二、定位问题:
用 devTool 的可以忽略下面的过程:
打开 Chrome Devtools ,进入到 Profiles 选项卡,点 Load 按钮,加载之前生成的快照。
对于内存快照,有四个视图,Summary,Comparison,Containment,Statistics,这里面常用的是前三个。
在 Summary 视图中,我们可以看到当前快照的全部信息,以及多个快照之间的信息。在列表里显示的都是对象的构造函数名字,可以先忽略被括号包裹的对象,优先观察其他的对象,最后再来看他们。后面的 shallow size 表示的是对象自身的大小,retained size 表示的是对象和它依赖对象的大小,一般是 GC 不可达的。
在 Comparison 视图中,我们可以进行多个快照之间的对比,这个用处比较大,如果我们将前两次快照进行对比,可能比较快速的定位出问题的对象。注意观察 New、Deleted、Delta,如果是内存泄漏的对象,可能是一直在 New,而没有 Deleted。
在 Containment 视图中,我们可以查看整个 GC 路径,当然一般不会用到。因为展开在 Summary 和 Comparison 列举的每一项,都可以看到从 GC roots 到这个对象的路径。通过这些路径,你可以看到这个对象的句柄被什么持有,从而定位问题产生的原因。值的注意的是,其中背景色*的,表示这个对象在 Javascript 中还存在引用,所以可能没有被清除。如果是红色的,表示的是这个对象在 Javascript 中不存在引用,但是依然存活在内存中,一般常见于 DOM 对象,它们存放的位置和 Javascript 中对象还是有不同的,在 Node.js 中很少遇见。
如何定位 Node.js 的内存泄漏
而这个方案,是直接调用底层 V8 的方法,生成的快照只有 Node.js 环境中的对象。memwatch 这个可以在代码里直接使用,实时检测内存动态,当发生内存泄漏的时候,会触发 ‘leak’ 事件,会传递当前的堆状态,配合 heapdump 有奇效。二、定位问题:用 devTool 的可以忽略下面的过程:打开 Chrome Devtools ...
如何分析 Node.js 中的内存泄漏
还有一些其他的情况可能会导致内存泄漏,比如缓存。在使用缓存的时候,得清楚缓存的对象的多少,如果缓存对象非常多,得做限制最大缓存数量处理。还有就是非常占用 CPU 的代码也会导致内存泄漏,服务器在运行的时候,如果有高 CPU 的同步代码,因为Node.js 是单线程的,所以不能处理处理请求,请求堆积导致...
如何自己检查NodeJS的代码是否存在内存泄漏
npm模块node-heapdump是一个非凡的模块,它可以使用来将v8引擎的堆内存内容dump出来,这样你就可以在Chrome的开发者工具中查看问题。你可以在开发工具中对比不同运行阶段的堆内存快照,这样可以帮助你定位到内存泄漏的位置。要想了解heapdump的更多内容,可以阅读这篇文章 现在让我们来试试 heapdump,在每...
从零开始搞监控系统(4)——内存泄漏
通过仔细排查,我们最终发现代码中对外部 queue 对象反复注册 error 事件是导致内存泄漏的关键原因。删除相关代码后,内存使用情况恢复正常,问题得到解决。为确保系统性能优化的有效性,我们查阅了相关参考资料,包括 Node.js 内存管理和 V8 垃圾回收机制、Loadtest 库的使用、内存使用错误处理、JavaScript 内...
如何自己检查NodeJS的代码是否存在内存泄漏
我们需要做的是:跟踪所有的内存分配和交互引用以及内存释放。我们的源代码使用Visual C++写成,当然这种解决方法也可以很轻松的使用在别的C++代码里面。要做的第一件事情是重载new和delete操作符,它们将会在所有的代码中被使用到。我们在stdafx.h中,加入:ifdef _DEBUG inline void * __cdecl operator...
如何在Node.js中检测内存泄漏
node检测内存泄露条件模块memwatch npm install --save memwatch var memwatch = require('memwatch');memwatch.setup();memwatch.on('leak', function(info) { console.error('Memory leak detected: ', info);});
Node.js 应用故障排查手册 —— Node.js 性能平台使用指南
内存泄漏:收到 Node.js 应用进程堆内存超过阈值告警时,在控制台对应实例点击堆快照按钮,生成堆快照文件,分析堆空间占用情况,定位泄漏对象和代码段。核心转储:收到服务器生成核心转储文件告警时,将文件转储到云端,通过 AliNode 定制分析,查看 Node.js 应用 Crash 时刻的线程信息和错误堆栈信息,定位...
node扩展 memwatch分析
memwatch是一个C++扩展,主要用于检测Node.js中的内存泄漏问题。它的基本用法包括配置文件binding.gyp,以及src目录下的多个源文件如heapdiff.cc、init.cc、memwatch.cc、util.cc。这些文件通过node模块系统在编译过程中找到依赖的nan目录。memwatch的入口函数在init.cc文件中,通过`NODE_MODULE(memwatch, ...
什么是内存泄漏?
首先,你是如何申请的内存就如何释放,也就是说:Node* pNode = new Node;Node* arrNode = new Node[10];delete pNode;delete [] arrNode;//~ 堆管理器(应用程序的,也可以是系统的)会根据相应的记录删除你申请的内存 如果不显式释放从堆上申请的内存,那么在进程的整个生命期内,这块内存就...
node.jsjavascriptruntime内存占用太高如何处理?
处理Node.js和JavaScript运行时内存占用过高的策略主要有以下几个方面:首先,排查并解决内存泄漏问题。内存泄漏是指程序执行过程中,不再使用的内存没有被正确释放,导致内存占用逐渐增加。可通过使用内存分析工具如heapdump、memwatch等来检测内存泄漏。其次,优化代码,减少内存使用。在编程时,可以应用优化...