接口:IHeapStringNode
IHeapStringNode
实例表示堆快照中的一个 JS 字符串。堆快照通常是一个图,其中图节点是 JS 堆对象,图边是 JS 堆对象之间的 JS 引用。
readonly
建议不要修改任何 IHeapStringNode
实例
- 示例: V8 或 Hermes 堆快照可以通过 getFullHeapFromFile API 解析。
import type {IHeapSnapshot, IHeapNode, IHeapStringNode} 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) => {
if (node.isString) {
const stringNode: IheapStringNode = node.toStringNode();
// get the string value
stringNode.stringValue;
}
});
})();
层级
↳
IHeapStringNode
属性
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
stringValue: string
获取与堆中的此 IHeapStringNode
实例关联的 JS 字符串堆对象的字符串值
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
> - 源: