小编pra*_*gma的帖子

Chrome 内存快照中的保留大小 - 究竟保留了什么?

Chrome 文档保留大小是“一旦对象本身被删除后释放的内存大小,以及从 GC 根无法访问的依赖对象”,这很公平。然而,即使对于简单的对象,保留大小通常是浅层大小的 3 倍。我知道 V8 需要存储对隐藏形状的引用,可能是一些用于 GC 的数据等等,但有时对象有数百个额外的“保留”字节,当您需要拥有数百万个此类对象时,这似乎是一个问题。我们来看一个简单的例子:

class TestObject {
    constructor( x, y, z ) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

window.arr = [];
for ( let i = 0; i < 100000; i++ ) {
    window.arr.push( new TestObject( Math.random(), Math.random(), Math.random() ) );
}
Run Code Online (Sandbox Code Playgroud)

这是内存快照:

内存快照,浅层大小为 24 字节,保留大小为 60 字节

浅层大小为 24 字节,这与我们存储 3 x 8 字节双精度的事实完美匹配。“额外”大小是 36 字节,它允许存储 9 x 4 字节的指针(假设指针压缩已打开)。如果我们添加三个额外的属性,额外的大小将是 72 (!) 字节,因此这取决于属性的数量。那里存放的是什么?是否有可能避免如此大量的内存开销?

javascript memory google-chrome v8 google-chrome-devtools

10
推荐指数
1
解决办法
2189
查看次数