如何正确调试Electron内存问题?

t98cgbkg  于 2023-03-21  发布在  Electron
关注(0)|答案(2)|浏览(637)

最近,我和我的团队越来越关注解决我们的电子应用程序中的高内存使用问题。我们的应用程序有几个渲染器进程,随着时间的推移,当我们的应用程序使用的内存量接近这个数量时,它们最终会消耗大量的内存。我们很可能要花大量的时间来跟踪这个泄漏。
最让我感到困惑的是,当我在Chrome Devtools的内存选项卡上查看时,这个值与我们从Activity Monitor中提取的值相比似乎完全合理。(下图是同时拍摄的)

我不知道从哪里开始了解这些信息。为什么这些数字如此不同?我们的Web应用程序是否存在漏洞,只会通过Electron应用程序内存暴露自己?我们的Electron应用程序渲染设置是否有问题?两者都有吗?
这类问题在使用Electron时似乎很常见,但在我的一生中,我无法找到资源来开始真正调试这个问题。我不一定要在我的设置中寻找直接的答案,因为我没有直接提供足够的信息。我只是在一个事实调查使命中,以更好地了解如何在Electron生态系统中调试这类问题。

wnrlj8wa

wnrlj8wa1#

我对电子不太了解,但是我喜欢研究和这类问题!我当然没有一个明确的解决方案给你,但我希望这些东西可以帮助你调试或取得一些进展,你的内存问题。
有一件事要提到的是,你可能有一个内存问题与3个独立的东西:

  • 可能是您自己的代码导致内存泄漏。
  • 可能是Electron导致了内存泄漏。
  • 可能是 chrome 导致了内存泄漏(因为电子正在使用 chrome )。

另一件事要提到的是,它不一定是内存“泄漏”,它也可能只是一个内存膨胀。区别是,与内存泄漏它会继续泄漏内存,直到它刚刚崩溃,而与内存膨胀它只会霸占所有的内存,直到没有什么离开之前,它开始删除旧的东西从内存中。
从你分享的内容来看,如果不进行调试和解决问题,很难判断问题出在哪里。所以我要做的是首先确保不是你自己的代码导致了泄漏/膨胀,尝试运行你的代码的一小部分,看看内存是否仍然是一个问题。然后开始逐步添加代码的更多部分,直到添加完所有部分。如果在任何时候内存开始成为问题,很可能是代码本身(但不一定,至少你已经确定了它是什么)。例如,如果你使用的图像组件上的内存突然开始增加,你可以确定它与图像/缓存有关。

你可以尝试的潜在事物

  • 首先调试您的代码,以确保它不是您的代码,或者如果它是您的代码,至少准确地指出它是什么。
  • 检查你正在使用的图片(或其他资源)是否被缓存了,以及这是否是导致内存堆积的原因。你可以使用一个cache-control头文件,并在dev-tools中禁用缓存,以确保在开发环境中没有缓存,这样你就可以看到这是否是缓存。
  • 检查是否有任何浏览器设置,你可以发挥周围的电子,我不知道如果你可以,但如果电子是使用 chrome 它站在情理之中,你应该能够发挥周围的设置,如硬件加速,禁用它从后台运行和预加载页面优化.事情我从这里读:https://ssiddique.info/fix-chrome-memory-leak.html.或者玩玩你能找到的任何类似的设置。

直觉上,我认为问题出在缓存上。在我看来,Electron可以使用大量的内存,如果它不断地缓存图像而不删除它,它将占用内存,直到什么都不剩下。在它开始从该高速缓存中删除旧内容之前。更糟糕的是,如果您使用swap/虚拟内存和RAM变满之前,它也会将这些内容写入磁盘,然后再从RAM中删除,这也可以解释磁盘空间的增加。我个人会尝试禁用所有缓存,看看会发生什么。这也是你可以在这里看到的:Changing backgroundImage causes memory leak (Electron)。下面是另一个示例:Changing image src constantly / memory usage (Electron),在这种情况下,我认为回答这个问题的人可能看到内存减少,因为当他使用base64时,图像不再被缓存。https://forums.raspberrypi.com/viewtopic.php?t=296598,在那里清除大量的缓存文件也起作用了。这里,electron memory usage profiling,是另一个人说他们所做的一切都是“显示图像”。缓存让我的蜘蛛感官刺痛。

你可以尝试/查看的无聊清单

https://github.com/electron/electron/issues/21586
电子中存在一个未决问题,即打开和关闭窗口时会发生内存泄漏。
Event Emitter Memory Leak in Electron App
有一个代码本身导致内存泄漏的示例,但也可能是与Electron本身相关的代码。
Memory leak in BrowserWindow, Electron
还有另一个例子,代码可以打破它,在这种情况下,它也是特定的电子。
chrome and chromium growing memory usage
有一个例子,内存泄漏造成的 chrome ,但我不知道如果这实际上是一个问题,因为它从来没有得到回答。
How to increase the max memory limit for the app built by electron-builder?
您可以尝试使用max-old-space-size增加/减少内存。

另一个重要考虑因素

我发现的另一个最可行的东西是https://seenaburns.com/debugging-electron-memory-usage/,他最终得出结论,它与RSS有关(也与缓存有关)。这个人,https://spectrum.chat/electron/general/debugging-high-memory-usage-in-electron~80057ff2-a51c-427f-b6e1-c297d47baf5b,也提到它与RSS有关,我还在这里发现了一个关于电子的开放问题:https://github.com/electron/electron/issues/25208,这与RSS内存泄漏有关。

最后说明

Electron将使用大量内存,因为它在浏览器/桌面Chromium中运行一个完整的浏览器,沿着运行v8和它自己的所有代码。除此之外,Chromium已经以高内存使用率而闻名。所以看到高内存相对正常。除此之外,如果内存只是膨胀,这是一个更容易解决的问题,只需找出是什么使它膨胀。很可能是缓存之类的东西。如果是内存泄漏,那么可能是任何东西,很可能是你自己的代码,但也可能是Electron或Chromium中的官方bug。

如果其他方法都失败了,你可以跳上https://www.reddit.com/r/programming/comments/7p7s8q/electron_is_cancer/的潮流。根据我的经验,用电子写的东西速度慢得令人难以置信,内存密集,在浏览器中无法生存,不和谐和懒散是最大的罪魁祸首。我可以让浏览器中的任何应用程序打开几天而没有任何问题,但离开这两个最终会崩溃我的浏览器。缩放是有点好,但"这可能是因为他们使用自己的SDK,只使用电子作为接口,而原子也比大多数应用程序更好,但正如该帖子的一条热门评论所指出的,他们用c++重写了一些核心部分。我对电子了解不多,所以我对它没有可信的看法,但我使用的使用Electron构建的应用程序总是有同样的内存问题。我认为Electron是一个很棒的想法和概念,随着时间的推移,应用程序已经改进了很多,所以尊重那些致力于它的团队,但我也认为它仍然有很多问题需要解决,尤其是在内存方面。

lb3vh1jj

lb3vh1jj2#

如果任何人遇到这个内存泄漏问题。首先,尝试删除所有consoleiderlog,看看是否有帮助。

相关问题