使用属性上的删除时,Javascript对象内存pipe理
我目前正在编写一个node.js / socket.io应用程序,但问题是一般的JavaScript。
我有一个关联数组为每个客户端连接存储颜色。 考虑以下:
var clientColors = new Array(); //This execute each new connection socket.on('connection', function(client){ clientColors[client.sessionId] = "red"; //This execute each time a client disconnect client.on('disconnect', function () { delete clientColors[client.sessionId]; }); });
如果我使用删除语句,我担心它会造成内存泄漏,因为以client.sessionId
值命名的属性(关联数组是对象)不会被删除,其引用的值将变成gonne,但属性仍然会存在于对象中。
我对吗?
delete clientColors[client.sessionId];
这将删除对象clientColors
上的对象的引用。 v8垃圾收集器将会拾取任何具有零引用的对象来进行垃圾回收。
现在,如果您问是否在IE4中创build了内存泄漏,那么这是一个不同的问题。 另一方面,v8可以轻松处理这个问题。
看到你删除唯一的参考财产也将消失。 还要注意,对象不是JavaScript中的“关联数组”,因为sorting是特定于实现的,而不是ES规范所允许的。
由于在这种情况下clientColors[client.sessionId]
是一个原始值(一个string),它将被立即清除。
让我们考虑foo[bar] = o
更复杂的情况, o
是非原始的(某个对象)。 重要的是要明白, o
不是存储在foo
内部,而是存储在任意内存位置。 foo
只是持有指向该位置的指针。 当你调用delete foo[bar]
,该指针被清除,并由垃圾收集器来释放o
所占用的内存。
顺便说一句:你不应该使用Array
当你想要一个关联数组。 后者在Javascript中被称为Object
,并且通常使用短文准文字{}
short-hand quasi literal)来实例化。
如果您使用V8引擎或nodejs / io,它可能不会导致泄漏,但总是build议防止泄漏。
只要删除它
delete clientColors[client.sessionId];
或者将其设置为null
clientColors[client.sessionId] = null;
哪些还会级联到任何原型inheritance的对象。
这样几乎没有发生泄漏的可能性。