包:@memlab/heap-analysis
类
- BaseAnalysis
- CollectionsHoldingStaleAnalysis
- DetachedDOMElementAnalysis
- GlobalVariableAnalysis
- ObjectFanoutAnalysis
- ObjectShallowAnalysis
- ObjectShapeAnalysis
- ObjectSizeAnalysis
- ObjectUnboundGrowthAnalysis
- ShapeUnboundGrowthAnalysis
- StringAnalysis
类型别名
AnalyzeSnapshotResult: Object
这是调用 analyzeSnapshotFromFile 或 analyzeSnapshotsInDirectory 的返回类型。
名称 | 类型 | 描述 |
---|---|---|
analysisOutputFile | string | 堆分析调用的控制台输出的文件路径 |
HeapAnalysisOptions: Object
这是传递给所有您自定义的堆分析应该实现的 process
方法的自动生成的参数。 你不应该构造此类的实例。
有关如何使用此选项的代码示例,请参阅 getSnapshotFileForAnalysis、loadHeapSnapshot 或 snapshotMapReduce。
RunHeapAnalysisOptions: Object
这是 analyzeSnapshotFromFile 和 analyzeSnapshotsInDirectory 的输入选项。
名称 | 类型 | 描述 |
---|---|---|
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
)
已弃用
- 参数:
file
:string
- 返回值:
Promise
<IHeapSnapshot
> - 源:
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 函数调用产生的中间结果的类型 |
T2 | reduce 函数调用的最终结果的类型 |
- 参数:
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();
})();