首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加到“`WeakSet`”中,但仍设法释放内存

添加到“`WeakSet`”中,但仍设法释放内存
EN

Stack Overflow用户
提问于 2016-04-08 15:28:37
回答 2查看 455关注 0票数 7

这很奇怪我注意到了。在使用WeakSet时,下面的代码不应该破坏内存,而且显然没有其他引用存在:

代码语言:javascript
复制
'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回购这里)

然而,它会破坏内存(在Node v4.3.2Babel转换中):

代码语言:javascript
复制
<--- 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! 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-15 02:04:17

更新 bug已经修复,today.The修复将移到Node6.0正在使用的v8 5.0,所以几周后,您将有一个已经修复的Node版本。

这是一个v8中的开放式bug。正如所述,您的代码应该工作得很好。问题基本上是,在这种情况下,v8不进行完全的垃圾收集,而是只进行最小的垃圾收集。

这在Chrome中不是很好,它没有在Chrome中泄漏的唯一原因是其他对象被创建并可以被释放--这些对象可以释放,从而触发完全垃圾收集,这也会清除WeakSet

WeakSet是天生的,在core-js中有一个聪明的填充,但是它并不是100%弱的,在这里使用或者是相关的。

票数 7
EN

Stack Overflow用户

发布于 2016-04-13 14:07:57

以下代码在Chrome 49中没有泄漏:

代码语言:javascript
复制
'use strict';

const s = new WeakSet();
let j = 0;
function f(){
    for (let i = 0 ; i<100000; i++) {
        s.add({});  
    }
    console.log(`${j++} :${0|(performance.memory.usedJSHeapSize/(1024*1024))}MB`);
    return Promise.resolve(null).then(f);
}
f()

,所以它看起来像是Node.js中的一个bug (在5.1.10版本中也是可复制的)。我已经填了一个Node.js for跟踪器中的这一问题

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36503554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档