跳至主要内容

接口: IHeapNode

IHeapNode 实例表示堆快照中的一个 JS 堆对象。堆快照通常是一个图,其中图节点是 JS 堆对象,图边是 JS 堆对象之间的引用。

readonly 建议不要修改任何 IHeapNode 实例

import type {IHeapSnapshot, IHeapNode} from '@memlab/core';
import {dumpNodeHeapSnapshot} from '@memlab/core';
import {getFullHeapFromFile} from '@memlab/heap-analysis';

(async function () {
const heapFile = dumpNodeHeapSnapshot();
const heap: IHeapSnapshot = await getFullHeapFromFile(heapFile);

// iterate over each node (heap object)
heap.nodes.forEach((node: IHeapNode, i: number) => {
// use the heap node APIs here
const id = node.id;
const type = node.type;
// ...
});
})();

继承关系

属性

dominatorNode: Nullable<IHeapNode>

获取此节点的支配节点。如果支配节点被释放,则从 GC 到此节点将没有路径,因此该节点也可以被释放。有关支配节点的更多信息,请查看 此文档


edge_count: number

传出的 JS 引用的总数(包括引擎内部引用、原生引用和 JS 引用)。


hasPathEdge: boolean

如果堆节点已被设置一个传入边,该传入边指向到 GC 根的最短路径上的父节点,则返回 true。


id: number

堆对象的唯一 ID


isString: boolean

检查这是否是一个字符串节点(普通字符串节点、连接字符串节点或切片字符串节点)


is_detached: boolean

  • 如果堆对象是一个 DOM 元素,并且该 DOM 元素从 DOM 树中分离,则 is_detached 将为 true

  • 如果堆对象是一个 React Fiber 节点,并且该 Fiber 节点从 React Fiber 树中卸载,则 is_detached 将为 true;否则为 false

  • 来源:


location: Nullable<IHeapLocation>

此堆对象的源位置信息(如果堆快照记录了此信息)。


name: string

这是与堆对象关联的 name 字段,对于 JS 对象实例(类型 object),name 是对象实例的构造函数的名称。 对于 stringname 是字符串值。


nodeIndex: number

此堆对象在 node.snapshot.nodes 伪数组中的索引


numOfReferrers: number

获取指向此堆对象的所有传入引用的数量(包括引擎内部引用、原生引用和 JS 引用)。


pathEdge: null| IHeapEdge

指向到 GC 根的最短路径上的父节点的传入边。


references: IHeapEdge[]

获取一个 JS 数组,其中包含从此堆对象传出的所有 JS 引用(包括引擎内部引用、原生引用和 JS 引用)。


referrers: IHeapEdge[]

获取一个 JS 数组,其中包含指向此堆对象的所有传入 JS 引用(包括引擎内部引用、原生引用和 JS 引用)。


retainedSize: number

堆对象的保留大小(即,如果释放此对象,则可以释放的内存总大小)。有关 保留大小浅层大小 之间的区别,请查看 此文档


self_size: number

堆对象的浅层大小(即,对象本身持有的内存大小)。有关 浅层大小保留大小 之间的区别,请查看 此文档


snapshot: IHeapSnapshot

获取包含此堆对象的 IHeapSnapshot


type: string

堆节点对象的类型。所有可能的类型:这是引擎特定的,例如 V8 中的所有类型:hidden, array, string, object, code, closure, regexp, number, native, synthetic, concatenated string, sliced string, symbol, bigint

方法

findAnyReference(predicate)

对于托管节点中的每个 JavaScript 引用(或从节点传出的边)执行一次提供的谓词回调,直到该谓词返回 true

  • 参数:

  • 返回: Nullable<IHeapEdge>| 第一个谓词返回 true 的传出边,如果未找到此类边,则返回 null

  • 示例:

const reference = node.findAnyReference((edge: IHeapEdge) => {
// find the outgoing reference with name "ref"
return edge.name_or_index === 'ref';
});

findAnyReferrer(predicate)

对于指向托管节点的每个 JavaScript 引用(或指向节点的传入边)执行一次提供的谓词回调,直到该谓词返回 true

  • 参数:

  • 返回: Nullable<IHeapEdge>| 第一个谓词返回 true 的传入边,如果未找到此类边,则返回 null

  • 示例:

const referrer = node.findAnyReferrer((edge: IHeapEdge) => {
// find the incoming reference with name "ref"
return edge.name_or_index === 'ref';
});

findAnyReferrerNode(predicate)

对于指向托管节点的每个 JavaScript 堆对象(堆图节点)(或具有指向托管节点的边的节点)执行一次提供的谓词回调,直到该谓词返回 true

  • 参数:

  • 返回: Nullable<IHeapNode>| 第一个谓词返回 true 的引用节点,如果未找到此类节点,则返回 null

  • 示例:

const referrer = node.findAnyReferrerNode((node: IHeapNode) => {
// find the referring node with name "Parent"
return node.name === 'Parent';
});

findReferrerNodes(predicate)

对于指向托管节点的每个 JavaScript 堆对象(堆图节点)(或具有指向托管节点的边的节点)执行一次提供的谓词回调

  • 参数:

  • 返回: IHeapNode[] | 一个包含所有谓词返回 true 的引用节点的数组,如果未找到此类节点,则返回一个空数组。

  • 示例:

const referrerNodes = node.findReferrerNodes((node: IHeapNode) => {
// find all the referring nodes with name "Parent"
return node.name === 'Parent';
});

findReferrers(predicate)

对于指向托管节点的每个 JavaScript 引用(或指向节点的传入边)执行一次提供的谓词回调

  • 参数:

  • 返回: IHeapEdge[] | 一个包含所有谓词返回 true 的传入边的数组,如果未找到此类边,则返回一个空数组。

  • 示例:

const referrers = node.findReferrers((edge: IHeapEdge) => {
// find all the incoming references with name "ref"
return edge.name_or_index === 'ref';
});

forEachReference(callback)

对于托管节点中的每个 JavaScript 引用(或从节点传出的边)执行一次提供的回调

  • 参数:

  • 返回: void | 此 API 返回 void

  • 示例:

node.forEachReference((edge: IHeapEdge) => {
// process edge ...

// if no need to iterate over remaining edges after
// the current edge in the node.references list
return {stop: true};
});

forEachReferrer(callback)

对于指向托管节点的每个 JavaScript 引用(或指向节点的传入边)执行一次提供的回调

  • 参数:

  • 返回: void | 此 API 返回 void

  • 示例:

node.forEachReferrer((edge: IHeapEdge) => {
// process edge ...

// if no need to iterate over remaining edges after
// the current edge in the node.referrers list
return {stop: true};
});

getAnyReferrer(edgeName, edgeType?)

给定 JS 引用的名称和类型,此 API 查找指向托管节点的传入 JS 引用。

  • 参数:

    • edgeName: string| number | 传入 JavaScript 引用的名称
    • edgeType?: string | 可选参数,指定传入的 JavaScript 引用的类型
  • 返回: Nullable<IHeapEdge>| 符合规范的传入边

  • 示例:

// find one of the JS reference named "ref" pointing to node
const reference = node.getAnyReferrer('ref', 'property');

getAnyReferrerNode(edgeName, edgeType?)

给定一个 JS 引用的名称和类型,此 API 查找指向宿主节点的其中一个传入 JS 引用,并返回包含传入引用的 JS 堆对象。

  • 参数:

    • edgeName: string| number | 传入 JavaScript 引用的名称
    • edgeType?: string | 可选参数,指定传入的 JavaScript 引用的类型
  • 返回: Nullable<IHeapNode>| 包含符合规范的传入 JS 引用的节点

  • 示例:

// find one of the JS heap object with a JS reference
// named "ref" pointing to node
const n1 = node.getAnyReferrerNode('ref', 'property');
// this is equivalent to
const n2 = node.getAnyReferrer('ref', 'property')?.fromNode;

getJSONifyableObject()

转换为简洁可读的对象,可用于序列化(如调用 JSON.stringify(node, ...args))。

此 API 不包含宿主对象捕获的所有信息。


getReference(edgeName, edgeType?)

给定一个 JS 引用的名称和类型,此 API 查找来自宿主节点的传出 JS 引用。

  • 参数:

    • edgeName: string| number | 传出的 JavaScript 引用的名称
    • edgeType?: string | 可选参数,指定传出的 JavaScript 引用的类型
  • 返回: Nullable<IHeapEdge>| 符合规范的传出边

  • 示例:

// find the internal reference to node's hidden class
const reference = node.getReference('map', 'hidden');

getReferenceNode(edgeName, edgeType?)

给定一个 JS 引用的名称和类型,此 API 查找来自宿主节点的传出 JS 引用,并返回传出 JS 引用指向的 JS 堆对象。

  • 参数:

    • edgeName: string| number | 传出的 JavaScript 引用的名称
    • edgeType?: string | 可选参数,指定传出的 JavaScript 引用的类型
  • 返回: Nullable<IHeapNode>| 传出引用指向的,符合规范的节点

  • 示例:

// find the node's hidden class
const hiddenClassNode = node.getReferenceNode('map', 'hidden');
// this is equivalent to
const hiddenClassNode2 = node.getReference('map', 'hidden')?.toNode;

getReferrerNodes(edgeName, edgeType?)

给定一个 JS 引用的名称和类型,此 API 查找指向宿主节点的所有传入 JS 引用,并返回一个数组,其中包含每个传入 JS 引用的宿主节点。

  • 参数:

    • edgeName: string| number | 传入 JavaScript 引用的名称
    • edgeType?: string | 可选参数,指定传入的 JavaScript 引用的类型
  • Returns: IHeapNode[] | 一个包含宿主节点的数组,每个节点对应于符合规范的每个传入 JS 引用

  • 示例:

// find all of the JS heap object with a JS reference
// named "ref" pointing to node
const nodes1 = node.getReferrerNodes('ref', 'property');
// this is equivalent to
const nodes2 = node.getReferrers('ref', 'property')
.map(edge => edge.fromNode);

getReferrers(edgeName, edgeType?)

给定一个 JS 引用的名称和类型,此 API 查找指向宿主节点的所有传入 JS 引用。

  • 参数:

    • edgeName: string| number | 传入 JavaScript 引用的名称
    • edgeType?: string | 可选参数,指定传入的 JavaScript 引用的类型
  • Returns: IHeapEdge[] | 一个包含所有符合规范的传入边的数组

  • 示例:

// find all of of the JS reference named "ref" pointing to node
const referrers = node.getReferrers('ref', 'property');

toJSONString(...args)

转换为简洁可读的字符串输出(如调用 JSON.stringify(node, ...args))。

注意:不建议使用 JSON.stringify(node, ...args),因为它会生成宿主对象的 JSON 表示,由于其与堆快照中其他数据结构的连接,该表示太大而难以轻松读取。

此 API 不完全序列化宿主对象捕获的所有信息。


toStringNode()

如果此节点是字符串节点,则转换为 IHeapStringNode 对象。IHeapStringNode 对象支持查询字符串节点内的字符串内容。

  • 层次结构
  • 属性
    • dominatorNode: Nullable<IHeapNode>
    • edge_count: number
    • hasPathEdge: boolean
    • id: number
    • isString: boolean
    • is_detached: boolean
    • location: Nullable<IHeapLocation>
    • name: string
    • nodeIndex: number
    • numOfReferrers: number
    • pathEdge: null | IHeapEdge
    • references: IHeapEdge[]
    • referrers: IHeapEdge[]
    • retainedSize: number
    • self_size: number
    • snapshot: IHeapSnapshot
    • type: string
  • 方法
    • findAnyReference(predicate)
    • findAnyReferrer(predicate)
    • findAnyReferrerNode(predicate)
    • findReferrerNodes(predicate)
    • findReferrers(predicate)
    • forEachReference(callback)
    • forEachReferrer(callback)
    • getAnyReferrer(edgeName, edgeType?)
    • getAnyReferrerNode(edgeName, edgeType?)
    • getJSONifyableObject()
    • getReference(edgeName, edgeType?)
    • getReferenceNode(edgeName, edgeType?)
    • getReferrerNodes(edgeName, edgeType?)
    • getReferrers(edgeName, edgeType?)
    • toJSONString(...args)
    • toStringNode()