首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs / Chrome内存调试

Nodejs / Chrome内存调试
EN

Stack Overflow用户
提问于 2022-02-28 18:13:49
回答 1查看 160关注 0票数 0

上下文:

我有一个内存似乎很高的Node.js应用程序,我不知道这是否是内存泄漏,因为它在一定时间之后会减少,但是在重载时,它持续增加需要更长的时间才能减少。

因此,通过这些文章和几个视频,我认为我必须堆快照并分析导致内存泄漏的原因。

步骤:

  1. 到目前为止,我已经在本地拍摄了4张快照来重现内存泄漏。

快照1: 800快照2: 1400快照3: 1600快照4: 2000+MB

  1. 当我将堆转储文件上传到chrome工具时,我看到了很多信息,但我不知道如何从那里开始。

请在屏幕截图下面检查,它显示构造函数数组具有687206的浅尺寸&列中保留的大小为721414,所以当扩展构造函数时,我可以看到创建了4097716个构造函数(请参阅下面的第二个屏幕快照)。

问题

  1. internal array []是什么意思?为什么会有4097716被创造?
  2. 如何筛选出我的应用程序创建的构造函数,并向我展示它而不是某些system/v8引擎构造函数?
  3. 在同一张屏幕截图中,一个构造函数使用称为tenantRequire函数的全局变量,这是自定义的全局函数,在某些地方内部使用,而不是普通的Node.js require,我在所有构造函数中都看到了这个变量,比如"Array“、"Object”。这是供参考的全局tenantRequire代码。它只是修补了尝试捕获的需求功能。这是不是导致内存泄漏的原因?
  4. 参考屏幕截图3,[string]构造函数它有270303848的浅尺寸。当我展开时,它显示了由Node.js加载的模块。为什么会有这么大的尺寸?&为什么在字符串构造函数中重复我的存档模块?

EN

回答 1

Stack Overflow用户

发布于 2022-09-20 11:44:01

如果不了解你的应用程序和导致内存使用率高的操作,就很难知道问题出在哪里。用来记录堆快照的工具是什么?在记录快照时,您执行的操作顺序是什么?你能把这个信息加到你的问题上吗?

几句话

你用node.js标记了这个问题,并展示了Chrome DevTools。没关系。您完全可以获取Node.js应用程序的堆快照,并在Chrome DevTools中对其进行分析。但是,由于Node.js和Chrome都使用相同的JS引擎(V8)和相同的垃圾收集器(奥里诺科),这对阅读这个问题的人来说可能有点混乱。为了确保我正确理解它:问题在Node.js应用程序中,而不是在浏览器应用程序中。您使用Chrome只是为了分析堆快照。对吗?

此外,您还编写了快照来再现内存泄漏。这不对。您执行了一些您认为会导致内存使用率较高的操作,记录了堆快照,然后将快照加载到Chrome DevTools中,以观察假定的内存泄漏。

跟踪第一,轮廓第二

每当您怀疑性能问题时,首先应该使用跟踪来了解应用程序中的哪些功能是有问题的(例如,缓慢地创建许多必须被垃圾收集的对象,等等)。然后,当您知道要关注哪个函数时,可以使用profile

试试这些视觉工具

有一些工具可以帮助您跟踪/分析您的应用程序。看看FlameScope (一个web应用程序)和节点诊所 (一套工具)。还有佩尔菲托,但我认为这是针对Chrome应用程序,而不是Node.js应用程序。

我还强烈推荐V8博客

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71299327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档