首页 > 解决方案 > 来自 Object.entries 内存使用情况的 JS 映射

问题描述

我正在尝试找出具有约 20k 个条目的 javascript Map 对象的内存使用情况 - 键是一个字符串,值是一个 1-2 个字符串的数组。我创建了 2 个地图:具有 17k 和 22k 条目。它们在 chrome profiler 中的内存使用量相同 - 怎么样?

为什么 Map 对象的大小只有在创建它们的对象从范围中删除后才不同?另外,我知道 hashmaps 是如何工作的,但是如果有人知道 js Map 如何保持订单,请告诉我(也许只是一个链接列表?)。

function createMap(){
    var obj = JSON.parse(bigStringRepresentingTheJSON);
    return new Map(Object.entries(obj));
}

查看分析器,我发现两个地图都占用 917kb - 那怎么可能?但是制作它们的对象(obj)需要 786kb 和 1 572kb - 这是合理的。

所以我想也许 Map 拥有一个指向创建它的 obj 的指针,这就是为什么它们的大小没有区别?然后,我使用 createMap 函数让 obj 得到垃圾收集。只有这样,Map 对象才会占用 1 个 9kb 和 2.3kb,这是意料之中的。

标签: javascriptdictionaryobjectmemory

解决方案


缩放 Map 很复杂,如果数据大小 << 映射大小,Hashmap 也会更有效,因为这样哈希冲突的频率就会降低。因此,Map 分配的比需要的多是有道理的,它可能会分配一个固定大小的哈希表,然后在需要时进行缩放。

如果这样做了,那么地图的大小完全取决于实现。

所以我想也许 Map 拥有一个指向创建它的 obj 的指针,这就是为什么它们的大小没有区别?

不, Map 仅包含对obj.


推荐阅读