上下文:
我有一个内存似乎很高的Node.js应用程序,我不知道这是否是内存泄漏,因为它在一定时间之后会减少,但是在重载时,它持续增加需要更长的时间才能减少。
因此,通过这些文章和几个视频,我认为我必须堆快照并分析导致内存泄漏的原因。
步骤:
快照1: 800快照2: 1400快照3: 1600快照4: 2000+MB
请在屏幕截图下面检查,它显示构造函数数组具有687206的浅尺寸&列中保留的大小为721414,所以当扩展构造函数时,我可以看到创建了4097716个构造函数(请参阅下面的第二个屏幕快照)。


问题
internal array []是什么意思?为什么会有4097716被创造?tenantRequire函数的全局变量,这是自定义的全局函数,在某些地方内部使用,而不是普通的Node.js require,我在所有构造函数中都看到了这个变量,比如"Array“、"Object”。这是供参考的全局tenantRequire代码。它只是修补了尝试捕获的需求功能。这是不是导致内存泄漏的原因?[string]构造函数它有270303848的浅尺寸。当我展开时,它显示了由Node.js加载的模块。为什么会有这么大的尺寸?&为什么在字符串构造函数中重复我的存档模块?

发布于 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博客。
https://stackoverflow.com/questions/71299327
复制相似问题