跳到主要内容

包:@memlab/heap-analysis

类型别名

AnalyzeSnapshotResult: Object

这是调用 analyzeSnapshotFromFileanalyzeSnapshotsInDirectory 的返回类型。

名称类型描述
analysisOutputFilestring堆分析调用的控制台输出的文件路径

HeapAnalysisOptions: Object

这是传递给所有您自定义的堆分析应该实现的 process 方法的自动生成的参数。 你不应该构造此类的实例。

有关如何使用此选项的代码示例,请参阅 getSnapshotFileForAnalysisloadHeapSnapshotsnapshotMapReduce


RunHeapAnalysisOptions: Object

这是 analyzeSnapshotFromFileanalyzeSnapshotsInDirectory 的输入选项。

名称类型描述
workDir?string指定应保存中间文件、日志文件和输出文件的工作目录

函数

getDominatorNodes(ids, snapshot)

此 API 计算输入堆对象的 支配节点 集合。

  • 参数:
    • ids: Set<number>| 堆对象(或节点)的 ID 集合
    • snapshot: IHeapSnapshot | 从堆快照加载的堆
  • 返回值: Set<number>| 支配节点/对象的集合
    • 示例:
import {dumpNodeHeapSnapshot} from '@memlab/core';
import {getFullHeapFromFile, getDominatorNodes} from '@memlab/heap-analysis';

class TestObject {}

(async function () {
const t1 = new TestObject();
const t2 = new TestObject();

// dump the heap of this running JavaScript program
const heapFile = dumpNodeHeapSnapshot();
const heap = await getFullHeapFromFile(heapFile);

// find the heap node for TestObject
let nodes = [];
heap.nodes.forEach(node => {
if (node.name === 'TestObject' && node.type === 'object') {
nodes.push(node);
}
});

// get the dominator nodes
const dominatorIds = getDominatorNodes(
new Set(nodes.map(node => node.id)),
heap,
);
})();

getFullHeapFromFile(file)

加载并解析 .heapsnapshot 文件,并计算元数据,例如支配节点和保留大小。

  • 参数:
    • file: string | .heapsnapshot 文件的绝对路径
  • 返回值: Promise<IHeapSnapshot>| 支持查询堆的堆图表示实例
  • 示例:
import {dumpNodeHeapSnapshot} from '@memlab/core';
import {getFullHeapFromFile} from '@memlab/heap-analysis';

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

getHeapFromFile(file)

已弃用


getSnapshotDirForAnalysis(options)

获取目录的绝对路径,该目录包含通过 HeapAnalysisOptions 传递给托管堆分析的所有堆快照文件。

此 API 应该在 BaseAnalysis 实例的重写的 process 方法中使用。

  • 参数:
    • options: HeapAnalysisOptions | 这是传递给所有 BaseAnalysis 实例的自动生成的输入
  • 返回值: Nullable<string>| 目录的绝对路径
  • 示例
import type {IHeapSnapshot} from '@memlab/core';
import type {HeapAnalysisOptions} from '@memlab/heap-analysis';
import {getSnapshotFileForAnalysis, BaseAnalysis} from '@memlab/heap-analysis';

class ExampleAnalysis extends BaseAnalysis {
public getCommandName(): string {
return 'example-analysis';
}

public getDescription(): string {
return 'an example analysis for demo';
}

async process(options: HeapAnalysisOptions): Promise<void> {
const directory = getSnapshotDirForAnalysis(options);
}
}

使用以下代码调用堆分析

const analysis = new ExampleAnalysis();
// any .heapsnapshot file recorded by memlab or saved manually from Chrome
await analysis.analyzeSnapshotFromFile(snapshotFile);

新的堆分析也可以与 analyze 一起使用,在这种情况下,getSnapshotDirForAnalysis 使用来自 BrowserInteractionResultReader 的快照目录。


getSnapshotFileForAnalysis(options)

获取通过 HeapAnalysisOptions 传递给托管堆分析的堆快照文件的绝对路径。

此 API 应该在 BaseAnalysis 实例的重写的 process 方法中使用。

  • 参数:
    • options: HeapAnalysisOptions | 这是传递给所有 BaseAnalysis 实例的自动生成的输入
  • 返回值: string | 堆快照文件的绝对路径
  • 示例
import type {IHeapSnapshot} from '@memlab/core';
import type {HeapAnalysisOptions} from '@memlab/heap-analysis';
import {getSnapshotFileForAnalysis, BaseAnalysis} from '@memlab/heap-analysis';

class ExampleAnalysis extends BaseAnalysis {
public getCommandName(): string {
return 'example-analysis';
}

public getDescription(): string {
return 'an example analysis for demo';
}

async process(options: HeapAnalysisOptions): Promise<void> {
const file = getSnapshotFileForAnalysis(options);
}
}

使用以下代码调用堆分析

const analysis = new ExampleAnalysis();
// any .heapsnapshot file recorded by memlab or saved manually from Chrome
await analysis.analyzeSnapshotFromFile(snapshotFile);

新的堆分析也可以与 analyze 一起使用,在这种情况下,getSnapshotFileForAnalysis 将使用来自 BrowserInteractionResultReader 的字母数字升序排列的最后一个堆快照。


loadHeapSnapshot(options)

基于通过 HeapAnalysisOptions 传递给托管堆分析的单个 JavaScript 堆快照加载堆图。

此 API 应该在 BaseAnalysis 实例的 process 实现中使用。

  • 参数:
    • options: HeapAnalysisOptions | 这是传递给所有 BaseAnalysis 实例的自动生成的输入
  • 返回值: Promise<IHeapSnapshot>| 堆的图表示
  • 示例
import type {IHeapSnapshot} from '@memlab/core';
import type {HeapAnalysisOptions} from '@memlab/heap-analysis';
import {loadHeapSnapshot, BaseAnalysis} from '@memlab/heap-analysis';

class ExampleAnalysis extends BaseAnalysis {
public getCommandName(): string {
return 'example-analysis';
}

public getDescription(): string {
return 'an example analysis for demo';
}

async process(options: HeapAnalysisOptions): Promise<void> {
const heap = await loadHeapSnapshot(options);
// doing heap analysis
}
}

使用以下代码调用堆分析

const analysis = new ExampleAnalysis();
// any .heapsnapshot file recorded by memlab or saved manually from Chrome
await analysis.analyzeSnapshotFromFile(snapshotFile);

新的堆分析也可以与 analyze 一起使用,在这种情况下,loadHeapSnapshot 将使用来自 BrowserInteractionResultReader 的字母数字升序排列的最后一个堆快照。


snapshotMapReduce<T1, T2>(mapCallback, reduceCallback, options)

当堆分析将多个堆快照作为内存分析的输入时(例如,查找哪个对象在一系列堆快照中不断增长),可以使用此 API 在所有堆快照上执行 MapRedue

此 API 应该在设计用于分析多个堆快照的 BaseAnalysis 实例的 process 实现中使用(例如,查找哪个对象随着时间的推移不断增长)

类型参数

名称描述
T1每个 map 函数调用产生的中间结果的类型
T2reduce 函数调用的最终结果的类型
  • 参数:
    • mapCallback: (snapshot: IHeapSnapshot, i: number, file: string) => T1 | MapReduce 中的 map 函数,该函数将应用于每个堆快照
    • reduceCallback: (results: T1[]) => T2 | MapReduce 中的 reduce 函数,该函数将所有 map 函数调用产生的中间结果作为输入
    • options: HeapAnalysisOptions | 这是传递给所有 BaseAnalysis 实例的自动生成的输入
  • 返回值: Promise<T2>| 你的 reduce 函数的返回值
  • 示例
import type {IHeapSnapshot} from '@memlab/core';
import type {HeapAnalysisOptions} from '@memlab/heap-analysis';
import {snapshotMapReduce, BaseAnalysis} from '@memlab/heap-analysis';

class ExampleAnalysis extends BaseAnalysis {
public getCommandName(): string {
return 'example-analysis';
}

public getDescription(): string {
return 'an example analysis for demo';
}

async process(options: HeapAnalysisOptions): Promise<void> {
// check if the number of heap objects keeps growing overtime
const isMonotonicIncreasing = await snapshotMapReduce(
(heap) => heap.nodes.length,
(nodeCounts) =>
nodeCounts[0] < nodeCounts[nodeCounts.length - 1] &&
nodeCounts.every((count, i) => i === 0 || count >= nodeCounts[i - 1]),
options,
);
}
}

使用以下代码调用堆分析

const analysis = new ExampleAnalysis();
// snapshotDir includes a series of .heapsnapshot files recorded by
// memlab or saved manually from Chrome, those files will be loaded
// in alphanumerically ascending order
await analysis.analyzeSnapshotsInDirectory(snapshotDir);

新的堆分析也可以与 analyze 一起使用,在这种情况下,snapshotMapReduce 将使用来自 BrowserInteractionResultReader 的字母数字升序排列的所有堆快照。

为什么不将所有堆快照作为 IHeapSnapshot 数组传入? 每个堆快照的大小可能很大,一次加载所有快照可能不可行。


takeNodeFullHeap()

获取当前程序状态的堆快照,并将其解析为 IHeapSnapshot。 此 API 还计算堆分析的一些元数据,但也意味着与 takeNodeMinimalHeap 相比,堆解析速度较慢。

  • 返回值: Promise<IHeapSnapshot>| 具有堆分析元数据的堆表示。

  • 示例

import type {IHeapSnapshot} from '@memlab/core';
import type {takeNodeFullHeap} from '@memlab/heap-analysis';

(async function () {
const heap: IHeapSnapshot = await takeNodeFullHeap();
})();
  • 类型别名
    • AnalyzeSnapshotResult: Object
    • HeapAnalysisOptions: Object
    • RunHeapAnalysisOptions: Object
  • 函数
    • getDominatorNodes(ids, snapshot)
    • getFullHeapFromFile(file)
    • getHeapFromFile(file)
    • getSnapshotDirForAnalysis(options)
    • getSnapshotFileForAnalysis(options)
    • loadHeapSnapshot(options)
    • snapshotMapReduce<T1, T2>(mapCallback, reduceCallback, options)
    • takeNodeFullHeap()