JavaScript怎样查看变量所占内存的大小
在python中,可以使用 sys.getsizeof 方法可以查看 python 对象的内存占用(单位:字节 byte)。
而JavaScript 不提供 C 系列语言中的sizeof方法,程序员不需要关心内存分配/释放。所以,该操作在js中相对比较麻烦。
本文总结了三个行之有效的方法,虽不精准,但也能粗略的估算对象在内存中的大小。
01 chrome 开发者工具法
chrome 开发者工具 -> memory -> Take snapshot -> 点击快照,在列表中寻找你的变量。
如下代码:在window对象下,生成对象、字符串、数组三个变量。
变量名以A_开头,如果是按名字排序,方便查找。
变量也可以适当弄大一点,按大小排序,方便查看。
window.A_object = {
"name":"matt",
"site":"www.mzh.ren",
"job":"boss",
"hobby":(new Array(1024**2).fill("coding")).join('...')
}
window.A_array = new Array(1024**2).fill("coding...")
window.A_string = (new Array(1024**2).fill("coding")).join('...')
在生成的快照中找到对应的网页的Window对象。
解释一下字段含义:
浅层大小 :对象本身占用的内存
保留的大小:对象本身及其引用总共占用的内存
距离:当前对象到根的引用层级距离
简单直接,一目了然。
02 object-sizeof
object-sizeof – npm
https://www.npmjs.com/package/object-sizeof
根据 ECMAScript 语言规范,每个 String 值由 16 位无符号整数表示,Number 使用双精度 64 位格式 IEEE 754 值,包括特殊的“非数字”(NaN)值、正无穷大, 和负无穷大。
在此基础上,就可以计算一个js对象将分配多少内存。
object-sizeof,就是一个这样的类库。
注意,该类库不适用于 V8 引擎,因为V8对编译后的代码还进行了大量优化,所以理论上object-sizeof得到的变量大小,应大于chrome开发工具的大小。
安装 object-sizeof
npm install object-sizeof
类似代码:
const sizeof = require('object-sizeof')
const A_object = {
"name":"matt",
"site":"www.mzh.ren",
"job":"boss",
"hobby":(new Array(1024**2).fill("coding")).join('...')
}
const A_array = new Array(1024**2).fill("coding...")
const A_string = (new Array(1024**2).fill("coding")).join('...')
console.log("A_object",sizeof(A_object))
console.log("A_string",sizeof(A_string))
console.log("A_array",sizeof(A_array))
得到大小:
确实要大于chrome开发者工具。
object-sizeof内部代码实现(核心部分):
03 查看进程
这个方法相当硬核。
memory – JavaScript object size – Stack Overflow
首先,打开PC的内存管理器。
在需要测算的代码前alert中断进程,代码执行完之后,再alert。再查看浏览器所占内存的变化。
这个办法是不是有点生猛?
代码如下:
function Marks() {
this.maxMarks = 100;
}
function Student() {
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
var manyObjects = new Array();
alert('before');
for (var i = 0; i < 2000000; i++)
manyObjects[i] = new Student();
alert('after');
往期推荐