Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
calculate memory size of javascript object, it is not a accurate value!
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));
};
@miadian
Copy link

miadian commented Feb 14, 2019

it should be:

sizeOf(key);
if(!obj.hasOwnProperty(key)) continue;
sizeOf(obj[key]); 

on lines 20,21.

@gi-joe-moto
Copy link

gi-joe-moto commented Feb 19, 2019

or

if (objClass != 'Array'){
  bytes += 2 * key.length;
}

@hunted-down-developer
Copy link

hunted-down-developer commented May 8, 2019

this is awesome! thanks!

@akleandrov
Copy link

akleandrov commented Sep 10, 2019

why boolean is 4 bytes? Maybe you have spec link?

@shevchenkonik
Copy link

shevchenkonik commented Nov 26, 2019

why boolean is 4 bytes? Maybe you have spec link?

@akleandrov

A boolean is actually 1 byte. But alignment may cause 4 bytes to be used on a 32-bit platform (or 8 bytes on a 64-bit platform). This is an old trick that comes from the observation that allocated memory takes up at least 4 or 8 bytes, and are aligned in such a way that the least significant bit or three will be zero.

Javascript engines (for example V8) are implemented using C++. You can find documentation about the size of boolean values in C++ spec. [1]

More information:
[1] –– http://eel.is/c++draft/expr.sizeof#footnoteref-69
https://www.quora.com/In-C%2B%2B-what-is-the-size-of-type-bool/answer/Sergey-Zubkov-1?ch=10&share=2471829a&srid=lXWU
https://stackoverflow.com/questions/32733314/in-v8-how-are-primitive-types-such-as-null-undefined-and-boolean-stored-in-me

@shevchenkonik
Copy link

shevchenkonik commented Nov 28, 2019

The function sizeOf doesn't work with Uint8Array and other standard types of arrays.

@sankethmandapati
Copy link

sankethmandapati commented Jan 9, 2020

Thankyou, it works

@begoat
Copy link

begoat commented Mar 26, 2020

awesome

@sagar-gavhane
Copy link

sagar-gavhane commented Jun 14, 2020

If someone looking for npm library to calculate size of an object in memory then give a try to this library: https://github.com/miktam/sizeof#readme

@liSong5713
Copy link

liSong5713 commented Jun 28, 2020

   `         bytes += obj.length * 2;`  why  obj.length*2 ,it should be Buffer.byteLength(str)

@ImCityHunter
Copy link

ImCityHunter commented Feb 15, 2021

why bytes += obj.toString().length * 2;

@0xhex
Copy link

0xhex commented May 19, 2021

i am getting error :
node:1863) UnhandledPromiseRejectionWarning: RangeError: Maximum call stack size exceeded
at Buffer.toString (buffer.js:776:46)

@kriit24
Copy link

kriit24 commented Nov 12, 2021

Im getting same error
Uncaught RangeError: Maximum call stack size exceeded

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment