【问题标题】:Garbage collection of deleted array element已删除数组元素的垃圾收集
【发布时间】:2014-05-12 13:12:57
【问题描述】:

如果我有一个大型数组,我会在应用程序的整个生命周期中一直使用,例如用户列表。是的,出于多种原因,我喜欢使用数组而不是对象,并且不能使用 splice(),因为我有索引引用。

垃圾回收的常用语录:

由于 Javascript 是垃圾回收,因此您无需删除 对象本身 - 当没有办法时它们将被移除 再参考他们。

这是否意味着当我删除数组中的元素时,由于可以随时引用该数组 - 垃圾收集器不会释放已删除的元素?或者这是否意味着因为无法引用该对象,它会释放内存? - 即使是这样,我的数组是否会被“未定义”条目填满,这些条目可能会占用至少 1 或 2 个字节的内存? - 有谁知道每个未定义条目使用了多少内存?

例子:

var userList = [];
var userNumber = 0;

userList[userNumber++] = {name:'john',score:200,friends:['abby','micky']};
userList[userNumber++] = {name:'jack',score:200,friends:['betty','billy']};
userList[userNumber++] = {name:'jimm',score:200,friends:['catty','ken']};

delete userList[1];
// will {name:'jack',score:200,friends[ n ]} size of memory be freed 
// or a little less to internally reference 'undefined'?

【问题讨论】:

  • 如果您不保留对该项目的其他引用,则一旦您调用delete userList[1],释放的元素空间就会被回收。数组本身占用的空间很大程度上取决于实现以及您使用数组的方式。
  • 除非您有数十亿用户,否则每个 undefined 条目 1 或 2 个字节不会很重要。在它变得重要之前,您将遇到使用该(巨大的)数组方式的问题。
  • 这个问题全是小问题。

标签: javascript arrays garbage-collection


【解决方案1】:

当你删除一个数组属性时,它的值变得不可访问*,因此只要你delete它们,垃圾收集器就可以释放它。

a = [0, 1, 2]
alert(1 in a);  // true
delete a[1];
alert(1 in a);  // false

* - 假设数组元素不能通过可访问对象或实时局部变量的属性以其他方式访问。


... - 垃圾收集器不会释放已删除的元素?还是说因为对象不能被引用,所以会释放内存?

垃圾收集器从来没有义务释放任何内存,但可以重用以前由已删除数组属性的值使用的任何内存,而该属性值没有被任何属性或实时局部变量引用。

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2013-04-21
    • 2019-08-05
    相关资源
    最近更新 更多