接口: IHeapNode
IHeapNode
实例表示堆快照中的一个 JS 堆对象。堆快照通常是一个图,其中图节点是 JS 堆对象,图边是 JS 堆对象之间的引用。
readonly
建议不要修改任何 IHeapNode
实例
- 示例:V8 或 hermes 堆快照可以通过 getFullHeapFromFile API 解析。
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;
// ...
});
})();
继承关系
IHeapNodeBasic
↳
IHeapNode
属性
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
是对象实例的构造函数的名称。 对于 string
,name
是字符串值。
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
参数:
predicate
:Predicator
<IHeapEdge
>| 每个传出的 JavaScript 引用的回调
返回:
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
参数:
predicate
:Predicator
<IHeapEdge
>| 每个传入 JavaScript 引用的回调
返回:
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
参数:
predicate
:Predicator
<IHeapNode
>| 每个传入 JavaScript 堆对象的回调
返回:
Nullable
<IHeapNode
>| 第一个谓词返回true
的引用节点,如果未找到此类节点,则返回null
。示例:
const referrer = node.findAnyReferrerNode((node: IHeapNode) => {
// find the referring node with name "Parent"
return node.name === 'Parent';
});
findReferrerNodes(predicate
)
对于指向托管节点的每个 JavaScript 堆对象(堆图节点)(或具有指向托管节点的边的节点)执行一次提供的谓词回调
参数:
predicate
:Predicator
<IHeapNode
>| 每个引用节点的回调
返回:
IHeapNode
[] | 一个包含所有谓词返回true
的引用节点的数组,如果未找到此类节点,则返回一个空数组。示例:
const referrerNodes = node.findReferrerNodes((node: IHeapNode) => {
// find all the referring nodes with name "Parent"
return node.name === 'Parent';
});
findReferrers(predicate
)
对于指向托管节点的每个 JavaScript 引用(或指向节点的传入边)执行一次提供的谓词回调
参数:
predicate
:Predicator
<IHeapEdge
>| 每个传入 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 引用(或从节点传出的边)执行一次提供的回调
参数:
callback
:EdgeIterationCallback
| 每个传出的 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 引用(或指向节点的传入边)执行一次提供的回调
参数:
callback
:EdgeIterationCallback
| 每个传入 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 引用的类型
示例:
// 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 引用的类型
示例:
// 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 不包含宿主对象捕获的所有信息。
- Returns:
AnyRecord
- 来源:
getReference(edgeName
, edgeType?
)
给定一个 JS 引用的名称和类型,此 API 查找来自宿主节点的传出 JS 引用。
参数:
edgeName
:string
|number
| 传出的 JavaScript 引用的名称edgeType?
:string
| 可选参数,指定传出的 JavaScript 引用的类型
示例:
// 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 引用的类型
示例:
// 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 不完全序列化宿主对象捕获的所有信息。
- 参数:
...args
:any
[]
- Returns:
string
- 来源:
toStringNode()
如果此节点是字符串节点,则转换为 IHeapStringNode 对象。IHeapStringNode 对象支持查询字符串节点内的字符串内容。
- Returns:
Nullable
<IHeapStringNode
> - 来源: