gpt4 book ai didi

javascript - 添加到 `WeakSet` 并设法破坏内存

转载 作者:数据小太阳 更新时间:2023-10-29 04:34:37 25 4
gpt4 key购买 nike

这是我注意到的一些奇怪的事情。由于使用了 WeakSet 并且显然没有其他引用存在,因此以下代码不应破坏内存:

'use strict';
require('babel-polyfill');

const s = new WeakSet();

for (let i = 0 ; ; i++) {
s.add({});
if (i % 100000 === 0)
console.log(`${i} :${process.memoryUsage().heapUsed}`);
}

(SCCE github 存储库 here )。

然而却破坏了它所做的内存(在 Node v4.3.2 中,使用 Babel 转译):

<--- Last few GCs --->

165 ms: Scavenge 13.6 (48.0) -> 13.6 (48.0) MB, 14.4 / 0 ms [allocation failure].
189 ms: Scavenge 14.4 (48.0) -> 14.4 (52.0) MB, 17.6 / 0 ms [allocation failure].
340 ms: Scavenge 37.5 (68.0) -> 37.5 (68.0) MB, 35.2 / 0 ms [allocation failure].
380 ms: Scavenge 38.3 (68.0) -> 38.3 (76.0) MB, 35.5 / 0 ms [allocation failure].
567 ms: Scavenge 53.5 (76.0) -> 53.4 (77.0) MB, 74.6 / 0 ms [allocation failure].


<--- JS stacktrace --->

==== JS stack trace =========================================

Security context: 0x228b1a4b4629 <JS Object>
1: add [native weak-collection.js:~92] [pc=0x2b4d202650b5] (this=0x386dbd0641f9 <JS WeakSet>,l=0x389216b5e19 <an Object with map 0x21f1c4616e79>)
2: /* anonymous */ [/home/mperdikeas/weak-set-blows-memory/es5/app.js:~1] [pc=0x2b4d20269023] (this=0x386dbd064221 <an Object with map 0x3193b8408829>,exports=0x228b1a4041b9 <undefined>,require=0x228b1a4041b9 <undefined>,module=0x228b1a4041b9 ...

FATAL ERROR: invalid table size Allocation failed - process out of memory
Aborted (core dumped)

npm ERR! Linux 3.16.0-48-generic
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "run" "start"
npm ERR! node v4.3.2
npm ERR! npm v2.14.12
npm ERR! code ELIFECYCLE
npm ERR! simple-babel-serverside-node-only-archetype@1.0.0 start: `node es5/app.js`
npm ERR! Exit status 134
npm ERR!

最佳答案

更新 该错误已于今天修复。修复正在移至 v8 5.0,这是 Node 6.0 使用的版本 - 因此在几周内您将拥有一个已修复该错误的 Node 版本。


这是一个 open bug in v8 .您所述的代码应该可以正常工作。问题基本上是 v8 在这种情况下不进行完整的垃圾收集,而只进行最小的垃圾收集。

这在 Chrome 中不能正常工作,它在 Chrome 中没有泄漏的唯一原因是因为创建了其他对象并且可以释放它们 - 那些可以释放的对象会触发完整的垃圾收集,这也会清除 WeakSet.

WeakSet 是原生的,在 core-js 中有一个巧妙的 polyfill,但它实际上并不是 100% 弱的,在这里使用或者是相关的。

关于javascript - 添加到 `WeakSet` 并设法破坏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36503554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com