我想知道JavaScript对象占用的大小。

取以下函数:

function Marks(){
  this.maxMarks = 100;
}

function Student(){
  this.firstName = "firstName";
  this.lastName = "lastName";
  this.marks = new Marks();
}

现在我实例化这个学生:

var stud = new Student();

这样我就可以做

stud.firstName = "new Firstname";

alert(stud.firstName);

stud.marks.maxMarks = 200;

etc.

现在,stud对象将在内存中占据一定大小。它有一些数据和更多的对象。

我如何找出有多少内存stud对象占用?类似于JavaScript中的sizeof() ?如果我能在一个函数调用中找到它,比如sizeof(stud),那就太棒了。

我已经在网上搜索了几个月了——没有找到它(在几个论坛上被问到——没有回复)。


当前回答

我使用Chrome开发工具的Timeline选项卡,实例化越来越多的对象,并得到像这样的良好估计。你可以像下面这样使用html作为样板,并修改它以更好地模拟对象的特征(属性的数量和类型等)。您可能希望在运行之前和之后单击开发工具选项卡底部的“垃圾位”图标。

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}

function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]={"some" : "thing"}
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

在我的Chromium上,实例化200万个对象,每个对象只有一个属性(如上面的代码所示)导致每个对象的粗略计算为50个字节。更改代码为每个对象创建一个随机字符串会为每个对象增加大约30个字节,等等。 希望这能有所帮助。

其他回答

有同样的问题。我在谷歌上搜索,我想与stackoverflow社区分享这个解决方案。

重要的是:

我使用了Yan Qing在github上分享的功能 https://gist.github.com/zensh/4975495

function memorySizeOf(obj) { var bytes = 0; function sizeOf(obj) { if(obj !== null && obj !== undefined) { switch(typeof obj) { case 'number': bytes += 8; break; case 'string': bytes += obj.length * 2; break; case 'boolean': bytes += 4; break; case 'object': var objClass = Object.prototype.toString.call(obj).slice(8, -1); if(objClass === 'Object' || objClass === 'Array') { for(var key in obj) { if(!obj.hasOwnProperty(key)) continue; sizeOf(obj[key]); } } else bytes += obj.toString().length * 2; break; } } return bytes; }; function formatByteSize(bytes) { if(bytes < 1024) return bytes + " bytes"; else if(bytes < 1048576) return(bytes / 1024).toFixed(3) + " KiB"; else if(bytes < 1073741824) return(bytes / 1048576).toFixed(3) + " MiB"; else return(bytes / 1073741824).toFixed(3) + " GiB"; }; return formatByteSize(sizeOf(obj)); }; var sizeOfStudentObject = memorySizeOf({Student: {firstName: 'firstName', lastName: 'lastName', marks: 10}}); console.log(sizeOfStudentObject);

你觉得怎么样?

我写这个只是为了解决一个类似的问题。它不完全做你可能要找的,即它不考虑解释器如何存储对象。

但是,如果你正在使用V8,它应该给你一个相当不错的近似,因为出色的原型和隐藏类舔掉了大部分开销。

function roughSizeOfObject( object ) {

    var objectList = [];

    var recurse = function( value )
    {
        var bytes = 0;

        if ( typeof value === 'boolean' ) {
            bytes = 4;
        }
        else if ( typeof value === 'string' ) {
            bytes = value.length * 2;
        }
        else if ( typeof value === 'number' ) {
            bytes = 8;
        }
        else if
        (
            typeof value === 'object'
            && objectList.indexOf( value ) === -1
        )
        {
            objectList[ objectList.length ] = value;

            for( i in value ) {
                bytes+= 8; // an assumed existence overhead
                bytes+= recurse( value[i] )
            }
        }

        return bytes;
    }

    return recurse( object );
}

如果您主要关心的是Firefox扩展的内存使用情况,我建议您咨询Mozilla开发人员。

Mozilla在其wiki上提供了一系列分析内存泄漏的工具。

有时我用它来标记非常大的对象,这些对象可能会从服务器发送到客户端。它不代表内存占用。它只会让你得到大约发送或存储它的成本。

还请注意,它很慢,仅用于开发。但是用一行代码就能得到大概的答案,这对我来说很有用。

roughObjSize = JSON.stringify(bigObject).length;

我有问题与上面的答案与ArrayBuffer。 在检查文档之后,我发现ArrayBuffer有一个byteLength属性,它告诉我我需要什么,因此:

函数sizeOf(数据) { If (typeof(data) === 'object') { if (ArrayBuffer的数据实例) { 返回data.byteLength; } //其他对象在这里 } //非对象情况 } console.log (sizeOf(新ArrayBuffer (15)));/ / 15

参考:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/byteLength