内存使用/传入函数的对象的垃圾收集

时间:2012-10-18 19:33:27

标签: javascript v8

当对象传递给函数时,对象按值传递(尽管对象的值是引用)。我将非常大的对象传递给我的函数,但只从函数中访问少量属性(6-12)。在Memorywise中,仅传递属性而不是整个对象会更好吗?或者如果我的属性是字符串,这实际上会产生更多的内存问题吗?

鉴于以下两个功能,记忆发生了什么?在f1中,javascript / v8是否在内存中创建了一个新的对象foo,还是只是一个指针?如果我访问字符串属性,它是否仍然只是一个指针,或者V8然后复制该字符串以在函数中使用。在f2中,我假设为函数创建了一个全新的字符串foo副本。这是正确的假设吗?

function f1(x) {
  var y = x.foo;
}

function f2(foo) {
  var y = foo;
}

var obj = {foo: "test"};
f1(obj);
f2(obj.foo);

1 个答案:

答案 0 :(得分:1)

  

“在Memorywise中,仅传递属性而不是整个对象会更好吗?或者如果我的属性是字符串,这会不会产生更多的内存问题?”

这需要更多内存。如果它们是字符串并不重要,因为字符串通常也被实现为引用类型,但是对于每个参数,将存在值的副本而不是仅仅是Object引用的单个副本。

对象引用的权重非常轻,因此您只需复制该对象而不是该对象的所有单个成员。

此外,如果您依赖函数内对象的突变,则需要这样做。


在您的示例中,只有一个属性被传递(一个字符串)。如果你的代码不依赖于对象本身的突变,那么两者之间就没有明显的区别。

在传递对象的示例中,唯一的副本是对象引用。它不是指针,但重量很轻,无需担心。

在传递字符串的示例中,似乎它会复制整个字符串,但由于stings在JavaScript中是不可变的,因此实现通常也会将它们作为引用类型实现。

因此,传递单个字符串与传递10,000个字符串一样高效。

相关问题