首页 > 解决方案 > Chrome堆快照结构解释

问题描述

使用 selenium,我拍摄了一个网站的内存快照,driver.execute_script(":takeHeapSnapshot")并提取了它的元数据:

{
    "snapshot": {
        "meta": {
            "node_fields": [
                "type", "name", "id", "self_size", "edge_count", "trace_node_id", "detachedness"
            ],
            "node_types": [
                ["hidden", "array", "string", "object", "code", "closure", "regexp", "number", "native", "synthetic", "concatenated string", "sliced string", "symbol", "bigint"],
                "string", "number", "number", "number", "number", "number"
            ],
            "edge_fields": [
                "type", "name_or_index", "to_node"
            ],
            "edge_types": [
                ["context", "element", "property", "internal", "hidden", "shortcut", "weak"],
                "string_or_number", "node"
            ],
            "trace_function_info_fields": [
                "function_id", "name", "script_name", "script_id", "line", "column"
            ],
            "trace_node_fields": [
                "id", "function_info_index", "count", "size", "children"
            ],
            "sample_fields": [
                "timestamp_us", "last_assigned_id"
            ],
            "location_fields": [
                "object_index", "script_id", "line", "column"
            ]
        },
        "node_count": 6182075,
        "edge_count": 17793245,
        "trace_function_count": 0
    }
}

有人可以解释一下每个字段的含义以及如何使用该信息来提取数据吗?什么是节点、边、位置字段等。例如,假设我在堆上有一个 ArrayBuffer,我知道它的大小(并且它是唯一的),我想检索这个数组。可以用快照做吗?

标签: javascriptgoogle-chrome-devtoolsjavascript-objectsheap-memorysnapshot

解决方案


元字段组解释了快照的不同数组的内容。

快照具有节点数组。该数组对堆中的每个节点都有 7 个数字,并且 node_fields 数组描述了所有这 7 个数字的含义。

同时 node_types 数组描述了这 7 个数字的类型。例如,如果节点数组中有接下来的 7 个数字 [ ....., 2, 9, 13, 42, 0, 0, 0, ......

然后是堆中的第 N 个节点

  1. 有“类型”字符串,因为 node_types[0][2] == 'string',
  2. 具有隐藏在堆的字符串数组中的“名称”。即字符串[9],
  3. 有“id”13,
  4. 使用 42 字节的堆
  5. 对堆中的其他对象有 0 个引用
  6. 有“trace_node_id”= 0,
  7. 具有“分离度”= 0,

edges 数组的每条边都有一个三元组数字,您可以在 edges_fields 中看到每个数字的名称,在 edge_types 数组中看到类型。例如边缘数组中偏移量 0 处的三元组 2、17、79 表示:

  1. 边缘实际上是对象的属性,因为 edge_types[0][2] = 'property'
  2. 属性名称隐藏在索引为 17 的字符串数组中
  3. 它指向了id为79的节点。(其实我忘了,是节点的索引还是节点的id)
  4. 如果节点数组的第一个节点的 edge_count = 2,那么边数组的前 2 个三元组是从这个节点到其他一些节点的边,等等。

我希望这个解释可以让你了解如何理解堆快照的内容。


推荐阅读