Memory leaks 使用mocha运行测试会导致内存泄漏和大型字符串结构

Memory leaks 使用mocha运行测试会导致内存泄漏和大型字符串结构,memory-leaks,electron,mocha.js,webdriver-io,spectron,Memory Leaks,Electron,Mocha.js,Webdriver Io,Spectron,我正在尝试设置一个环境来检测应用程序中的内存泄漏 应用程序设置:角度+电子 使用Mocha+Spectron+WebDrivero模拟应用程序使用 我在新安装的应用程序上运行不同用户场景的测试,并定期收集每个进程的内存使用情况 当应用程序处于空闲状态时,内存使用情况与预期一致。但是我遇到了其他测试用例的问题似乎在使用mocha运行测试时,我在内存中得到了意想不到的未知结构。这会导致内存泄漏。 我在下面附上了一个屏幕截图(),它最好地描述了我的困惑 快照1:在应用程序设置后拍摄(81.8 MB

我正在尝试设置一个环境来检测应用程序中的内存泄漏

应用程序设置:角度+电子
使用Mocha+Spectron+WebDrivero模拟应用程序使用

我在新安装的应用程序上运行不同用户场景的测试,并定期收集每个进程的内存使用情况

当应用程序处于空闲状态时,内存使用情况与预期一致。但是我遇到了其他测试用例的问题似乎在使用mocha运行测试时,我在内存中得到了意想不到的未知结构。这会导致内存泄漏。


我在下面附上了一个屏幕截图(),它最好地描述了我的困惑

  • 快照1:在应用程序设置后拍摄(81.8 MB
  • 快照2:在一组测试完成(正常使用约10分钟)且应用程序返回到启动状态(109 MB)后拍摄
  • 快照3:在强制GC后拍摄(通过“收集垃圾”按钮)(108 MB
比较快照1和快照2,我可以看到大部分内存在哪里(~19MB):以字符串形式

对保持器的检查告诉我,这些字符串链接到(全局处理程序)>(GC根),选择其中一个字符串并在控制台中执行
$0
,所有字符串的输出结果相同:
。当我将元素悬停时,它会链接到我的应用程序的主体(对于每个字符串)

“扩展字符串结构”给了我一种感觉,这是由于某些模块被多次加载,并且其引用从未被破坏(我猜是通过
internal/modules/cjs/loader.js:136
中的
module()
加载的)

当使用“分配时间线”检查内存时,我在“堆快照>比较”下的“未释放内存”中找不到导致新“大字符串对象”的相同操作的“大字符串对象”

当我手动模拟测试场景或通过控制台中的功能模拟点击时,没有内存泄漏。

所有这些都让我觉得,我在做或使用错误的东西(关于摩卡咖啡)


我的问题是:

  • 摩卡咖啡是否不适合这种设置(即,在关闭应用程序之前,它会保存一些参考)
  • 如果一个结构仅由(全局处理程序)>(GC根)保留,它将在何时释放?我读到,它们不是你需要担心的事情,但就我而言,它们是:/
  • 当通过
    $0
    调用时,如何有多个字符串(多个引用?)都引用相同的DOM元素(
  • 为什么这个字符串对象在“分配时间线”中不可见
  • 这种内存泄漏的原因是什么
  • 不,我不认为这和摩卡咖啡有关
  • 诀窍在于mocha在nodejs端运行,并使用webdriver协议(HTTP)通过chromiumdriver控制浏览器:

    从你的快照中的字符串中我可以看到,实际上是从chromedriver发送到你的应用程序中的一些代码

    我相信这是chromedriver的问题

  • 当chromedriver试图执行一些命令时,这可能是对页面的一些注入
  • 您可以尝试清理测试之间的Cookie、本地和会话存储,或者使用硬重新加载-但重新加载非常慢

    或者只重新加载当前上下文

    您还可以尝试在应用程序端手动执行一些clenup js代码

    我花时间尝试获取更多数据。您是正确的,字符串中的代码来自chromedriver,看起来代码块注入了“callFunction()”方法。对于我对应用程序的每次调用,都会向堆中添加一个字符串。使用
    .refresh()
    刷新当前上下文会清理堆。但我担心这也会重置我的内存泄漏,我正试图抓住它。你有什么建议我可以写,或者我可以研究些什么来尝试解决这个问题吗?@user3650404可能使用chrome内置探查器可以帮助检测内存泄漏,但实际上客户端性能测试最好从功能测试中分离出来,不要将它们混合在一起。