我们使用 --max-old-space-size=8192 通过 npm test 运行完整的 E2E jest 26 测试。
node --max-old-space-size=8192 node_modules/jest/bin/jest --runInBand --coverage --detectOpenHandles --logHeapUsage --no-cache
Run Code Online (Sandbox Code Playgroud)
我们升级到节点 16.14.2,突然测试在 Windows 和 Ubuntu 20.04.4 LTS 下的 OOM 处停止在 4G。
与节点 17.8.0 的行为相同
我切换回节点 14.18.1 并使用进程资源管理器查看以下性能图。
对于节点 16,我在 E2E 测试开始时在 4G 时出现 OOM。
<--- Last few GCs --->
[14184:00000277700CA440] 1097059 ms: Mark-sweep (reduce) 2799.4 (3161.8) -> 2798.8 (3123.2) MB, 1520.8 / 0.4 ms (average mu = 0.099, current mu = 0.064) last resort GC in old space requested
[14184:00000277700CA440] 1098475 ms: …Run Code Online (Sandbox Code Playgroud) 以下代码会增加内存使用量直至崩溃:
const httpContext = require('express-http-context');
async function t2() {
}
async function t1() {
for (let i = 0; i < 100000000; i++) {
httpContext.ns.run(t2);
}
}
t1();
Run Code Online (Sandbox Code Playgroud)
运行它:node --inspect --max-old-space-size=300 ns
问题:命名空间 _contexts 映射永远不会被清理。
cls-hooked/context.js 中有一个函数 destroy(id) 但它从未被调用。
我还尝试了 ns.bind、ns.runPromise (它执行 ns.exit())和 ns.bind
运行结束后如何删除上下文?
代码:
const httpContext = require('express-http-context');
function t2() {
}
async function t1() {
for (let i = 0; i < 100000000; i++) {
httpContext.ns.run(t2);
}
}
t1();
Run Code Online (Sandbox Code Playgroud)
作品。
代码:
const httpContext = require('express-http-context');
async function …Run Code Online (Sandbox Code Playgroud)