【问题标题】:Jest memory leak issue开玩笑的内存泄漏问题
【发布时间】:2022-08-20 01:26:06
【问题描述】:

我正在我的 NodeJS api 上运行 jest 单元和集成测试,我面临一些可能存在内存泄漏的问题。 我尝试将 Jest 从 26.3.2 升级到 27.5.1,但这并没有太大帮助。 我从 chrome 控制台拍摄了一些堆快照。

快照 1

快照 2

快照 3

快照 4

从上面的快照我可以看到使用量的增加非常高。但我无法理解出了什么问题。

我看到 String、Object 和 JSBufferData 出现了问题。但不确定是什么问题。

如果是字符串,我会看到:

库的字符串化版本的多个调用/行,但是这是从哪里来的,为什么?

在对象的情况下:

屏幕截图中的对象可能来自我使用countries-list 的库,这是为了获取国家/地区列表以查找 ISO 名称。

最后是 JSBufferData,它指向类似 URLSearchParam 的东西,但我没有在我的应用程序的任何地方使用上述任何对象/库:

我使用的堆栈:

节点JS:16.14.2 开玩笑:27.5.1 jest-searial-runner:1.2.0

  • 你在哪里以及如何加载你的对象?看起来你正在使用包xlsx;您正在加载文件进行测试吗?文件引用是否在测试中保留?

标签: testing jestjs memory-leaks out-of-memory


【解决方案1】:

您可以尝试使用 --logHeapUsage
来自documentation

每次测试后记录堆使用情况。用于调试内存泄漏。 在节点中与 --runInBand 和 --expose-gc 一起使用。

您可以尝试使用 --expose-gc 公开垃圾收集器并添加

afterAll(() => {
  global.gc && global.gc()
})

另一个选项是jest -w 1 以避免这些内存问题。

--maxWorkers
别名:-w。指定工作池的最大工作人员数 将产生运行测试。在单次运行模式下,这默认为 您机器上可用的内核数减去主内核数 线。在监视模式下,这默认为可用内核的一半 您的机器,以确保 Jest 不显眼且不会磨碎您的机器 机器停下来。在资源有限的情况下调整它可能很有用 像 CI 这样的环境,但默认值对于大多数人来说应该足够了 用例。
对于具有可变 CPU 可用的环境,您可以使用基于百分比的配置:--maxWorkers=50%

参考:
Cannot find memory leak in my Express.js Jest tests
My Jests tests are leaking memory, how can I fix this?
What are the steps to follow to debug memory leak in Jest?
https://chanind.github.io/javascript/2019/10/12/jest-tests-memory-leak.html

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多