跳到主要内容

接口:IHeapStringNode

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

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

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;
}
});
})();

层级

属性

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


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

  • 参数:

  • 返回: 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
    • stringValue: string
    • 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()