meminsight-core-publish 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Index.d.ts +21 -0
- package/dist/Index.d.ts.map +1 -0
- package/dist/Index.js +65 -0
- package/dist/analyzer/AnalysisInfo.d.ts +112 -0
- package/dist/analyzer/AnalysisInfo.d.ts.map +1 -0
- package/dist/analyzer/AnalysisInfo.js +217 -0
- package/dist/analyzer/ArkAnalyzer.d.ts +30 -0
- package/dist/analyzer/ArkAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/ArkAnalyzer.js +52 -0
- package/dist/analyzer/ArkCmpCfg.d.ts +15 -0
- package/dist/analyzer/ArkCmpCfg.d.ts.map +1 -0
- package/dist/analyzer/ArkCmpCfg.js +15 -0
- package/dist/analyzer/ArkCompareAnalyzer.d.ts +52 -0
- package/dist/analyzer/ArkCompareAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/ArkCompareAnalyzer.js +144 -0
- package/dist/analyzer/ArkLeakAnalyzer.d.ts +14 -0
- package/dist/analyzer/ArkLeakAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/ArkLeakAnalyzer.js +18 -0
- package/dist/analyzer/ArkSerializer.d.ts +18 -0
- package/dist/analyzer/ArkSerializer.d.ts.map +1 -0
- package/dist/analyzer/ArkSerializer.js +155 -0
- package/dist/analyzer/ArkStatAnalyzer.d.ts +56 -0
- package/dist/analyzer/ArkStatAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/ArkStatAnalyzer.js +224 -0
- package/dist/analyzer/ArkStatCfg.d.ts +42 -0
- package/dist/analyzer/ArkStatCfg.d.ts.map +1 -0
- package/dist/analyzer/ArkStatCfg.js +42 -0
- package/dist/analyzer/ArkTracePath.d.ts +90 -0
- package/dist/analyzer/ArkTracePath.d.ts.map +1 -0
- package/dist/analyzer/ArkTracePath.js +245 -0
- package/dist/analyzer/ArkTracer.d.ts +17 -0
- package/dist/analyzer/ArkTracer.d.ts.map +1 -0
- package/dist/analyzer/ArkTracer.js +27 -0
- package/dist/analyzer/ArkXAnalyzer.d.ts +69 -0
- package/dist/analyzer/ArkXAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/ArkXAnalyzer.js +616 -0
- package/dist/analyzer/IAnalyzer.d.ts +25 -0
- package/dist/analyzer/IAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/IAnalyzer.js +2 -0
- package/dist/file/FileReader.d.ts +51 -0
- package/dist/file/FileReader.d.ts.map +1 -0
- package/dist/file/FileReader.js +110 -0
- package/dist/file/FileService.d.ts +23 -0
- package/dist/file/FileService.d.ts.map +1 -0
- package/dist/file/FileService.js +65 -0
- package/dist/file/FileWriter.d.ts +82 -0
- package/dist/file/FileWriter.d.ts.map +1 -0
- package/dist/file/FileWriter.js +160 -0
- package/dist/report/Reporter.d.ts +27 -0
- package/dist/report/Reporter.d.ts.map +1 -0
- package/dist/report/Reporter.js +61 -0
- package/dist/report/templates/template.d.ts +3 -0
- package/dist/report/templates/template.d.ts.map +1 -0
- package/dist/report/templates/template.js +106 -0
- package/dist/shell/DeviceShell.d.ts +96 -0
- package/dist/shell/DeviceShell.d.ts.map +1 -0
- package/dist/shell/DeviceShell.js +180 -0
- package/dist/shell/Shell.d.ts +52 -0
- package/dist/shell/Shell.d.ts.map +1 -0
- package/dist/shell/Shell.js +79 -0
- package/dist/types/Constants.d.ts +15 -0
- package/dist/types/Constants.d.ts.map +1 -0
- package/dist/types/Constants.js +18 -0
- package/dist/types/LeakTypes.d.ts +18 -0
- package/dist/types/LeakTypes.d.ts.map +1 -0
- package/dist/types/LeakTypes.js +2 -0
- package/dist/types/OhosTypes.d.ts +74 -0
- package/dist/types/OhosTypes.d.ts.map +1 -0
- package/dist/types/OhosTypes.js +83 -0
- package/dist/utils/Common.d.ts +14 -0
- package/dist/utils/Common.d.ts.map +1 -0
- package/dist/utils/Common.js +38 -0
- package/dist/utils/Finder.d.ts +163 -0
- package/dist/utils/Finder.d.ts.map +1 -0
- package/dist/utils/Finder.js +355 -0
- package/dist/utils/Loader.d.ts +30 -0
- package/dist/utils/Loader.d.ts.map +1 -0
- package/dist/utils/Loader.js +71 -0
- package/dist/utils/Log.d.ts +140 -0
- package/dist/utils/Log.d.ts.map +1 -0
- package/dist/utils/Log.js +177 -0
- package/dist/utils/Output.d.ts +126 -0
- package/dist/utils/Output.d.ts.map +1 -0
- package/dist/utils/Output.js +225 -0
- package/package.json +61 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ark Statistics Configuration
|
|
3
|
+
*/
|
|
4
|
+
export type ArkStatCfg = {
|
|
5
|
+
Node: {
|
|
6
|
+
enableTypeWhiteList: boolean;
|
|
7
|
+
typeWhiteList: string[];
|
|
8
|
+
enableTypeBlackList: boolean;
|
|
9
|
+
typeBlackList: string[];
|
|
10
|
+
enableNameWhiteList: boolean;
|
|
11
|
+
nameWhiteList: string[];
|
|
12
|
+
enableNameBlackList: boolean;
|
|
13
|
+
nameBlackList: string[];
|
|
14
|
+
enableId: boolean;
|
|
15
|
+
enableType: boolean;
|
|
16
|
+
enableName: boolean;
|
|
17
|
+
enableSelfSize: boolean;
|
|
18
|
+
enableRetainedSize: boolean;
|
|
19
|
+
};
|
|
20
|
+
Path: {
|
|
21
|
+
enableDistance: boolean;
|
|
22
|
+
enableSelfSize: boolean;
|
|
23
|
+
enableRetainedSize: boolean;
|
|
24
|
+
enableNativeSize: boolean;
|
|
25
|
+
enableShortest: boolean;
|
|
26
|
+
enableShortestLength: boolean;
|
|
27
|
+
shortestLength: number;
|
|
28
|
+
enableAggration: boolean;
|
|
29
|
+
aggrationLength: number;
|
|
30
|
+
aggrationDescending: boolean;
|
|
31
|
+
enableMinRetainedSize: boolean;
|
|
32
|
+
minRetainedSize: number;
|
|
33
|
+
enableMaxRetainedSize: boolean;
|
|
34
|
+
maxRetainedSize: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Ark Statistics default configuration
|
|
39
|
+
* @returns default configuration
|
|
40
|
+
*/
|
|
41
|
+
export declare function defaultArkStatCfg(): ArkStatCfg;
|
|
42
|
+
//# sourceMappingURL=ArkStatCfg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArkStatCfg.d.ts","sourceRoot":"","sources":["../../src/analyzer/ArkStatCfg.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACrB,IAAI,EAAE;QACF,mBAAmB,EAAE,OAAO,CAAC;QAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,mBAAmB,EAAE,OAAO,CAAC;QAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,mBAAmB,EAAE,OAAO,CAAC;QAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,mBAAmB,EAAE,OAAO,CAAC;QAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,cAAc,EAAE,OAAO,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;KAC/B,CAAC;IACF,IAAI,EAAE;QACF,cAAc,EAAE,OAAO,CAAC;QACxB,cAAc,EAAE,OAAO,CAAC;QACxB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,gBAAgB,EAAE,OAAO,CAAC;QAC1B,cAAc,EAAE,OAAO,CAAC;QACxB,oBAAoB,EAAE,OAAO,CAAC;QAC9B,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,OAAO,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;QACxB,mBAAmB,EAAE,OAAO,CAAC;QAC7B,qBAAqB,EAAE,OAAO,CAAC;QAC/B,eAAe,EAAE,MAAM,CAAC;QACxB,qBAAqB,EAAE,OAAO,CAAC;QAC/B,eAAe,EAAE,MAAM,CAAC;KAC3B,CAAA;CACJ,CAAA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAK,UAAU,CAmC/C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultArkStatCfg = defaultArkStatCfg;
|
|
4
|
+
/**
|
|
5
|
+
* Ark Statistics default configuration
|
|
6
|
+
* @returns default configuration
|
|
7
|
+
*/
|
|
8
|
+
function defaultArkStatCfg() {
|
|
9
|
+
return {
|
|
10
|
+
Node: {
|
|
11
|
+
enableTypeWhiteList: true,
|
|
12
|
+
typeWhiteList: ["object", "closure", "string", "array"],
|
|
13
|
+
enableTypeBlackList: false,
|
|
14
|
+
typeBlackList: [],
|
|
15
|
+
enableNameWhiteList: false,
|
|
16
|
+
nameWhiteList: [],
|
|
17
|
+
enableNameBlackList: false,
|
|
18
|
+
nameBlackList: [],
|
|
19
|
+
enableId: true,
|
|
20
|
+
enableType: true,
|
|
21
|
+
enableName: true,
|
|
22
|
+
enableSelfSize: false,
|
|
23
|
+
enableRetainedSize: false,
|
|
24
|
+
},
|
|
25
|
+
Path: {
|
|
26
|
+
enableDistance: true,
|
|
27
|
+
enableSelfSize: true,
|
|
28
|
+
enableRetainedSize: true,
|
|
29
|
+
enableNativeSize: false,
|
|
30
|
+
enableShortest: true,
|
|
31
|
+
enableShortestLength: false,
|
|
32
|
+
shortestLength: 0,
|
|
33
|
+
enableAggration: true,
|
|
34
|
+
aggrationLength: 3,
|
|
35
|
+
aggrationDescending: true,
|
|
36
|
+
enableMinRetainedSize: true,
|
|
37
|
+
minRetainedSize: 1024 * 1024, // 1MB
|
|
38
|
+
enableMaxRetainedSize: false,
|
|
39
|
+
maxRetainedSize: 0,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { IHeapSnapshot, IHeapNode, LeakTracePathItem } from '@memlab/core';
|
|
2
|
+
import { ILoggable } from '../utils/Log';
|
|
3
|
+
/**
|
|
4
|
+
* ArkTracePathItem
|
|
5
|
+
*/
|
|
6
|
+
export type ArkTracePathItem = LeakTracePathItem;
|
|
7
|
+
/**
|
|
8
|
+
* ArkNodeTracePath
|
|
9
|
+
*/
|
|
10
|
+
export declare class ArkNodeTracePath {
|
|
11
|
+
readonly tracePathItem: ArkTracePathItem;
|
|
12
|
+
readonly uid: string;
|
|
13
|
+
readonly nodeIds: number[];
|
|
14
|
+
readonly reverse: boolean;
|
|
15
|
+
readonly retainedSize: number;
|
|
16
|
+
constructor(item: ArkTracePathItem, reverse?: boolean);
|
|
17
|
+
getTracePathInfo(joinStr?: string): string;
|
|
18
|
+
static getNodeIdTrace(item: ArkTracePathItem): number[];
|
|
19
|
+
/**
|
|
20
|
+
* 获取本路径上的节点retained size
|
|
21
|
+
* @param item
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
static getRetainedSize(item: ArkTracePathItem): number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* ArkNode最短路径uid和最短路径索引关系对象
|
|
28
|
+
*/
|
|
29
|
+
export declare class ArkNodePathIndexes {
|
|
30
|
+
readonly uid: string;
|
|
31
|
+
indexes: number[];
|
|
32
|
+
constructor(uid: string);
|
|
33
|
+
addIndex(index: number): void;
|
|
34
|
+
get(filter: (condition: any) => boolean, condition: any): number[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* ArkNodes
|
|
38
|
+
*/
|
|
39
|
+
export declare class ArkNodes extends Array<number> implements ILoggable {
|
|
40
|
+
readonly DOMAIN: string;
|
|
41
|
+
readonly TAG: string;
|
|
42
|
+
className: string;
|
|
43
|
+
selfSize: number;
|
|
44
|
+
retainedSize: number;
|
|
45
|
+
shortestPaths: ArkNodeTracePath[];
|
|
46
|
+
aggrationPathIndexes: Map<string, ArkNodePathIndexes>;
|
|
47
|
+
/**
|
|
48
|
+
* ArkNodes constructor
|
|
49
|
+
* @param className node name
|
|
50
|
+
* @param selfSize node self size
|
|
51
|
+
* @param retainedSize node retained size
|
|
52
|
+
*/
|
|
53
|
+
constructor(className: string, selfSize: number, retainedSize: number);
|
|
54
|
+
/**
|
|
55
|
+
* add shortest node trace path
|
|
56
|
+
* @param path shortest node trace path
|
|
57
|
+
*/
|
|
58
|
+
addShortestPath(path: ArkNodeTracePath): void;
|
|
59
|
+
/**
|
|
60
|
+
* add node id
|
|
61
|
+
* @param nodeId node id
|
|
62
|
+
*/
|
|
63
|
+
addNodeId(nodeId: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* 获取最短路径uid和最短路径索引和引用次数的映射数据
|
|
66
|
+
* uid = [...node.id].join('->')
|
|
67
|
+
* @param descending 按引用次数降序排序,否则升序排序
|
|
68
|
+
* @param maxIndexLength 最大引用路径个数
|
|
69
|
+
*/
|
|
70
|
+
getAggrationPathIndexes(descending?: boolean, maxIndexLength?: number, minRetainedSize?: number): void;
|
|
71
|
+
getPathIndexesRetainedSize(uid: string): number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* ArkNodes Map<nodeName, nodeId array>
|
|
75
|
+
*/
|
|
76
|
+
export declare class ArkNodesMap extends Map<string, ArkNodes> implements ILoggable {
|
|
77
|
+
DOMAIN: string;
|
|
78
|
+
TAG: string;
|
|
79
|
+
constructor();
|
|
80
|
+
/**
|
|
81
|
+
* add node to map
|
|
82
|
+
* @param snapshot heap snapshot
|
|
83
|
+
* @param node heap node
|
|
84
|
+
* @param nameWhiteList node names
|
|
85
|
+
* @param typeWhiteList node types
|
|
86
|
+
* @param enableShortestPath enable shortest path
|
|
87
|
+
*/
|
|
88
|
+
addNode(snapshot: IHeapSnapshot, node: IHeapNode, nameWhiteList: string[], typeWhiteList?: string[], enableShortestPath?: boolean): void;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=ArkTracePath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArkTracePath.d.ts","sourceRoot":"","sources":["../../src/analyzer/ArkTracePath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE1E,OAAO,EAAE,SAAS,EAAO,MAAM,cAAc,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,CAAC;AAEjD;;GAEG;AACH,qBAAa,gBAAgB;IACzB,SAAgB,aAAa,EAAE,gBAAgB,CAAC;IAChD,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,SAAgB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClC,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,YAAY,EAAE,MAAM,CAAC;gBAEzB,IAAI,EAAE,gBAAgB,EAAE,OAAO,GAAE,OAAe;IAQrD,gBAAgB,CAAC,OAAO,GAAE,MAAe,GAAI,MAAM;WAsB5C,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAI,MAAM,EAAE;IAc/D;;;;OAIG;WACW,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAI,MAAM;CAajE;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC3B,SAAgB,GAAG,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEb,GAAG,EAAE,MAAM;IAIhB,QAAQ,CAAC,KAAK,EAAE,MAAM;IAItB,GAAG,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,OAAO,EAAE,SAAS,EAAE,GAAG;CAKjE;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK,CAAC,MAAM,CAAE,YAAW,SAAS;IAC5D,SAAgB,MAAM,EAAE,MAAM,CAAgB;IAC9C,SAAgB,GAAG,EAAE,MAAM,CAAiB;IACrC,SAAS,EAAE,MAAM,CAAM;IACvB,QAAQ,EAAE,MAAM,CAAK;IACrB,YAAY,EAAE,MAAM,CAAK;IACzB,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAE7D;;;;;OAKG;gBACS,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAOrE;;;OAGG;IACI,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAI,IAAI;IAIrD;;;OAGG;IACI,SAAS,CAAC,MAAM,EAAE,MAAM,GAAI,IAAI;IAIvC;;;;;OAKG;IACI,uBAAuB,CAAC,UAAU,GAAE,OAAc,EACrD,cAAc,GAAE,MAAW,EAAE,eAAe,SAAK,GAAI,IAAI;IAwCtD,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAI,MAAM;CAgB1D;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAE,YAAW,SAAS;IACvE,MAAM,EAAE,MAAM,CAAe;IAC7B,GAAG,EAAE,MAAM,CAAoB;;IAM/B;;;;;;;OAOG;IACI,OAAO,CACV,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,SAAS,EACf,aAAa,EAAE,MAAM,EAAE,EACvB,aAAa,GAAE,MAAM,EAAe,EACpC,kBAAkB,GAAE,OAAc,GAAI,IAAI;CAiCjD"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ArkNodesMap = exports.ArkNodes = exports.ArkNodePathIndexes = exports.ArkNodeTracePath = void 0;
|
|
4
|
+
const Finder_1 = require("../utils/Finder");
|
|
5
|
+
const Log_1 = require("../utils/Log");
|
|
6
|
+
/**
|
|
7
|
+
* ArkNodeTracePath
|
|
8
|
+
*/
|
|
9
|
+
class ArkNodeTracePath {
|
|
10
|
+
constructor(item, reverse = false) {
|
|
11
|
+
this.tracePathItem = item;
|
|
12
|
+
this.nodeIds = ArkNodeTracePath.getNodeIdTrace(item);
|
|
13
|
+
this.retainedSize = ArkNodeTracePath.getRetainedSize(item);
|
|
14
|
+
this.reverse = reverse;
|
|
15
|
+
this.uid = reverse ? this.nodeIds.reverse().join('<-') : this.nodeIds.join('->');
|
|
16
|
+
}
|
|
17
|
+
getTracePathInfo(joinStr = '===>') {
|
|
18
|
+
var _a;
|
|
19
|
+
if (this.nodeIds.length === 0) {
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
const snapshot = (_a = this.tracePathItem.node) === null || _a === void 0 ? void 0 : _a.snapshot;
|
|
23
|
+
if (!snapshot) {
|
|
24
|
+
Log_1.Log.error('meminsight', ArkNodeTracePath.name, 'Failed to get snapshot.');
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
const result = [];
|
|
28
|
+
this.nodeIds.forEach(id => {
|
|
29
|
+
let node = snapshot.getNodeById(id);
|
|
30
|
+
if (node) {
|
|
31
|
+
let sizeStr = node.retainedSize >= 1024 * 1024 ?
|
|
32
|
+
(node.retainedSize / (1024 * 1024)).toFixed(2) + 'MB' :
|
|
33
|
+
(node.retainedSize / 1024).toFixed(2) + 'KB';
|
|
34
|
+
result.push(`@${id} (${node.type}) [${sizeStr}] ${node.name}`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return result.join(`\n${joinStr}`);
|
|
38
|
+
}
|
|
39
|
+
static getNodeIdTrace(item) {
|
|
40
|
+
const nodeIds = [];
|
|
41
|
+
let curItem = item;
|
|
42
|
+
while (curItem) {
|
|
43
|
+
let node = curItem.node;
|
|
44
|
+
if (!node) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
nodeIds.push(node.id);
|
|
48
|
+
curItem = curItem.next;
|
|
49
|
+
}
|
|
50
|
+
return nodeIds;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 获取本路径上的节点retained size
|
|
54
|
+
* @param item
|
|
55
|
+
* @returns
|
|
56
|
+
*/
|
|
57
|
+
static getRetainedSize(item) {
|
|
58
|
+
let retained = 0;
|
|
59
|
+
let curItem = item;
|
|
60
|
+
while (curItem) {
|
|
61
|
+
let node = curItem.node;
|
|
62
|
+
if (!node) {
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
retained += node.self_size;
|
|
66
|
+
curItem = curItem.next;
|
|
67
|
+
}
|
|
68
|
+
return retained;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.ArkNodeTracePath = ArkNodeTracePath;
|
|
72
|
+
/**
|
|
73
|
+
* ArkNode最短路径uid和最短路径索引关系对象
|
|
74
|
+
*/
|
|
75
|
+
class ArkNodePathIndexes {
|
|
76
|
+
constructor(uid) {
|
|
77
|
+
this.uid = uid;
|
|
78
|
+
}
|
|
79
|
+
addIndex(index) {
|
|
80
|
+
this.indexes.push(index);
|
|
81
|
+
}
|
|
82
|
+
get(filter, condition) {
|
|
83
|
+
return this.indexes.filter((index) => {
|
|
84
|
+
return filter(condition);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.ArkNodePathIndexes = ArkNodePathIndexes;
|
|
89
|
+
/**
|
|
90
|
+
* ArkNodes
|
|
91
|
+
*/
|
|
92
|
+
class ArkNodes extends Array {
|
|
93
|
+
/**
|
|
94
|
+
* ArkNodes constructor
|
|
95
|
+
* @param className node name
|
|
96
|
+
* @param selfSize node self size
|
|
97
|
+
* @param retainedSize node retained size
|
|
98
|
+
*/
|
|
99
|
+
constructor(className, selfSize, retainedSize) {
|
|
100
|
+
super();
|
|
101
|
+
this.DOMAIN = 'meminsight';
|
|
102
|
+
this.TAG = ArkNodes.name;
|
|
103
|
+
this.className = ''; // node class name
|
|
104
|
+
this.selfSize = 0; // node total self size
|
|
105
|
+
this.retainedSize = 0; // node total retained size
|
|
106
|
+
this.className = className;
|
|
107
|
+
this.selfSize = selfSize;
|
|
108
|
+
this.retainedSize = retainedSize;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* add shortest node trace path
|
|
112
|
+
* @param path shortest node trace path
|
|
113
|
+
*/
|
|
114
|
+
addShortestPath(path) {
|
|
115
|
+
this.shortestPaths.push(path);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* add node id
|
|
119
|
+
* @param nodeId node id
|
|
120
|
+
*/
|
|
121
|
+
addNodeId(nodeId) {
|
|
122
|
+
this.push(nodeId);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 获取最短路径uid和最短路径索引和引用次数的映射数据
|
|
126
|
+
* uid = [...node.id].join('->')
|
|
127
|
+
* @param descending 按引用次数降序排序,否则升序排序
|
|
128
|
+
* @param maxIndexLength 最大引用路径个数
|
|
129
|
+
*/
|
|
130
|
+
getAggrationPathIndexes(descending = true, maxIndexLength = -1, minRetainedSize = -1) {
|
|
131
|
+
if (this.shortestPaths.length === 0) {
|
|
132
|
+
Log_1.Log.warnX(this, 'No shortest path found');
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
const indexes = new Map();
|
|
136
|
+
this.shortestPaths.forEach((path, index) => {
|
|
137
|
+
const indexesItem = indexes.get(path.uid);
|
|
138
|
+
if (!indexesItem) {
|
|
139
|
+
const pathIndexes = new ArkNodePathIndexes(path.uid);
|
|
140
|
+
pathIndexes.addIndex(index);
|
|
141
|
+
indexes.set(path.uid, pathIndexes);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
indexesItem.addIndex(index);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
const sortedIndexes = descending
|
|
148
|
+
? new Map([...indexes.entries()].sort((a, b) => a[1].indexes.length - b[1].indexes.length))
|
|
149
|
+
: new Map([...indexes.entries()].sort((a, b) => b[1].indexes.length - a[1].indexes.length));
|
|
150
|
+
if ((maxIndexLength <= 0) || (sortedIndexes.size <= maxIndexLength)) {
|
|
151
|
+
this.aggrationPathIndexes = sortedIndexes;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
this.aggrationPathIndexes = new Map([...sortedIndexes.entries()].slice(0, maxIndexLength));
|
|
155
|
+
}
|
|
156
|
+
if (minRetainedSize > 0) {
|
|
157
|
+
this.aggrationPathIndexes.forEach((pathIndexes, uid) => {
|
|
158
|
+
var _a;
|
|
159
|
+
const tmpIndexes = [];
|
|
160
|
+
let idx = pathIndexes.indexes.pop();
|
|
161
|
+
while (idx) {
|
|
162
|
+
let size = ((_a = this.shortestPaths.at(idx)) === null || _a === void 0 ? void 0 : _a.retainedSize) || 0;
|
|
163
|
+
if (size >= minRetainedSize) {
|
|
164
|
+
tmpIndexes.push(idx);
|
|
165
|
+
}
|
|
166
|
+
idx = pathIndexes.indexes.pop();
|
|
167
|
+
}
|
|
168
|
+
pathIndexes.indexes = tmpIndexes;
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
getPathIndexesRetainedSize(uid) {
|
|
173
|
+
let pathIndexes = this.aggrationPathIndexes.get(uid);
|
|
174
|
+
if (!pathIndexes) {
|
|
175
|
+
return 0;
|
|
176
|
+
}
|
|
177
|
+
let preSize = 0;
|
|
178
|
+
let curSize;
|
|
179
|
+
return pathIndexes.indexes.reduce((pre, cur) => {
|
|
180
|
+
var _a;
|
|
181
|
+
curSize = (_a = this.shortestPaths.at(cur)) === null || _a === void 0 ? void 0 : _a.retainedSize;
|
|
182
|
+
if (!curSize) {
|
|
183
|
+
return preSize;
|
|
184
|
+
}
|
|
185
|
+
preSize = curSize;
|
|
186
|
+
return preSize + curSize;
|
|
187
|
+
}, 0);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.ArkNodes = ArkNodes;
|
|
191
|
+
/**
|
|
192
|
+
* ArkNodes Map<nodeName, nodeId array>
|
|
193
|
+
*/
|
|
194
|
+
class ArkNodesMap extends Map {
|
|
195
|
+
constructor() {
|
|
196
|
+
super();
|
|
197
|
+
this.DOMAIN = 'meminsight';
|
|
198
|
+
this.TAG = ArkNodesMap.name;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* add node to map
|
|
202
|
+
* @param snapshot heap snapshot
|
|
203
|
+
* @param node heap node
|
|
204
|
+
* @param nameWhiteList node names
|
|
205
|
+
* @param typeWhiteList node types
|
|
206
|
+
* @param enableShortestPath enable shortest path
|
|
207
|
+
*/
|
|
208
|
+
addNode(snapshot, node, nameWhiteList, typeWhiteList = ['object'], enableShortestPath = true) {
|
|
209
|
+
// true if names is empty or types include node.type
|
|
210
|
+
if ((nameWhiteList.length == 0
|
|
211
|
+
|| nameWhiteList.includes(node.name))
|
|
212
|
+
&& typeWhiteList.includes(node.type)) {
|
|
213
|
+
const arkNodes = this.get(node.name);
|
|
214
|
+
if (!arkNodes) {
|
|
215
|
+
let arkNodes = new ArkNodes(node.name, node.self_size, node.retainedSize);
|
|
216
|
+
if (enableShortestPath) {
|
|
217
|
+
const arkTracePathItem = Finder_1.Finder.findShortestPathToGCRoot(snapshot, node);
|
|
218
|
+
if (arkTracePathItem) {
|
|
219
|
+
arkNodes.addShortestPath(new ArkNodeTracePath(arkTracePathItem));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
Log_1.Log.errorX(this, 'ArkNodesMap1: Finder.findShortestPathToGCRoot return undefined.');
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
arkNodes.addNodeId(node.id);
|
|
226
|
+
this.set(node.name, arkNodes);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
arkNodes.selfSize += node.self_size;
|
|
230
|
+
arkNodes.retainedSize += node.retainedSize;
|
|
231
|
+
if (enableShortestPath) {
|
|
232
|
+
const arkTracePathItem = Finder_1.Finder.findShortestPathToGCRoot(snapshot, node);
|
|
233
|
+
if (arkTracePathItem) {
|
|
234
|
+
arkNodes.addShortestPath(new ArkNodeTracePath(arkTracePathItem));
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
Log_1.Log.errorX(this, 'ArkNodesMap2: Finder.findShortestPathToGCRoot return undefined.');
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
arkNodes.addNodeId(node.id);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
exports.ArkNodesMap = ArkNodesMap;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ArkTracePathItem } from "./ArkTracePath";
|
|
2
|
+
/**
|
|
3
|
+
* ArkTracePath Filter function
|
|
4
|
+
*/
|
|
5
|
+
export type ArkTracePathFilter = (condition?: any) => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* ArkTracePath Output function
|
|
8
|
+
*/
|
|
9
|
+
export type ArkTracePathOutput = (path: ArkTracePathItem, filter?: ArkTracePathFilter, condition?: any) => string;
|
|
10
|
+
/**
|
|
11
|
+
* ArkTracer
|
|
12
|
+
*/
|
|
13
|
+
export declare class ArkTracer {
|
|
14
|
+
static outputTracePath(tracePath: ArkTracePathItem, output?: ArkTracePathOutput, filter?: ArkTracePathFilter, condition?: any): void;
|
|
15
|
+
static getTracePathString(tracePath: ArkTracePathItem, output?: ArkTracePathOutput, filter?: ArkTracePathFilter, condition?: any): string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ArkTracer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArkTracer.d.ts","sourceRoot":"","sources":["../../src/analyzer/ArkTracer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC;AAC9D;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,kBAAkB,EAAE,SAAS,CAAC,EAAE,GAAG,KAAK,MAAM,CAAC;AAOlH;;GAEG;AACH,qBAAa,SAAS;WACJ,eAAe,CACzB,SAAS,EAAE,gBAAgB,EAC3B,MAAM,CAAC,EAAE,kBAAkB,EAC3B,MAAM,CAAC,EAAE,kBAAkB,EAC3B,SAAS,CAAC,EAAE,GAAG,GAAI,IAAI;WASb,kBAAkB,CAC5B,SAAS,EAAE,gBAAgB,EAC3B,MAAM,CAAC,EAAE,kBAAkB,EAC3B,MAAM,CAAC,EAAE,kBAAkB,EAC3B,SAAS,CAAC,EAAE,GAAG,GAAI,MAAM;CAGhC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ArkTracer = void 0;
|
|
4
|
+
const core_1 = require("@memlab/core");
|
|
5
|
+
const defaultOutput = (path) => {
|
|
6
|
+
var _a;
|
|
7
|
+
let snapshot = (_a = path === null || path === void 0 ? void 0 : path.node) === null || _a === void 0 ? void 0 : _a.snapshot;
|
|
8
|
+
return snapshot ? core_1.serializer.summarizePath(path, new Set(), snapshot, { color: true }) : '';
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* ArkTracer
|
|
12
|
+
*/
|
|
13
|
+
class ArkTracer {
|
|
14
|
+
static outputTracePath(tracePath, output, filter, condition) {
|
|
15
|
+
let result = output ? output(tracePath, filter, condition) : defaultOutput(tracePath);
|
|
16
|
+
if (result !== '') {
|
|
17
|
+
console.log(result);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.log('No leak trace path.');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
static getTracePathString(tracePath, output, filter, condition) {
|
|
24
|
+
return output ? output(tracePath, filter, condition) : defaultOutput(tracePath);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.ArkTracer = ArkTracer;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { IHeapSnapshot } from "@memlab/core";
|
|
2
|
+
import { ArkAnalyzer } from "./ArkAnalyzer";
|
|
3
|
+
import { ILoggable } from "../utils/Log";
|
|
4
|
+
import { IBaseInfo } from "./AnalysisInfo";
|
|
5
|
+
export declare enum ArkXSortType {
|
|
6
|
+
BY_RETAINED_SIZE = 0,
|
|
7
|
+
BY_COUNT = 1
|
|
8
|
+
}
|
|
9
|
+
export type ArkXAnalyzerConfig = {
|
|
10
|
+
topN: number;
|
|
11
|
+
sortType: ArkXSortType;
|
|
12
|
+
tags: string[];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Ark Heapsnapshot 统计分析器
|
|
16
|
+
*/
|
|
17
|
+
export declare class ArkXAnalyzer extends ArkAnalyzer implements ILoggable {
|
|
18
|
+
readonly DOMAIN = "meminsight";
|
|
19
|
+
readonly TAG: string;
|
|
20
|
+
static readonly NAME = "ark-x-analyzer";
|
|
21
|
+
static readonly DESC = "Analyze heapsnapshot files and aggregate & statistics.";
|
|
22
|
+
private snapshotFiles;
|
|
23
|
+
private config;
|
|
24
|
+
constructor();
|
|
25
|
+
setConfig(config: ArkXAnalyzerConfig): void;
|
|
26
|
+
analyze(args: any[]): Promise<void>;
|
|
27
|
+
private analyzeOne;
|
|
28
|
+
/**
|
|
29
|
+
* 指定类名对象按 Distance 统计
|
|
30
|
+
*/
|
|
31
|
+
statSpecificObjectNameByDistance(snapshot: IHeapSnapshot, objectName: string): IBaseInfo;
|
|
32
|
+
/**
|
|
33
|
+
* 指定类名的最短引用链聚合
|
|
34
|
+
* @param snapshot 快照
|
|
35
|
+
* @param topNum TopN
|
|
36
|
+
*/
|
|
37
|
+
aggregateSpecificObjectNameByReference(snapshot: IHeapSnapshot, objectName: string, topNum?: number): IBaseInfo;
|
|
38
|
+
/**
|
|
39
|
+
* 指定类名的Distance=1的对象属性按最短引用链聚合
|
|
40
|
+
* @param snapshot 快照
|
|
41
|
+
* @param objectName
|
|
42
|
+
* @param topNum TopN
|
|
43
|
+
*/
|
|
44
|
+
aggregateSpecificObjectNameByDistance1(snapshot: IHeapSnapshot, objectName: string, topNum?: number, maxRetainedSize?: number): IBaseInfo;
|
|
45
|
+
/**
|
|
46
|
+
* 指定类名的最短引用链聚合
|
|
47
|
+
* @param snapshot 快照
|
|
48
|
+
* @param topNum TopN
|
|
49
|
+
*/
|
|
50
|
+
aggregateSpecificObjectTypeByReference(snapshot: IHeapSnapshot, objectType: string, topNum?: number): IBaseInfo;
|
|
51
|
+
/**
|
|
52
|
+
* 指定类名/类型/标签的最短引用链聚合
|
|
53
|
+
* @param snapshot 快照
|
|
54
|
+
* @param objectName 对象类名,为空则不判断
|
|
55
|
+
* @param objectType 对象类型,为空则不判断
|
|
56
|
+
* @param tags 对象标签,比如业务标签
|
|
57
|
+
* @param topNum TopN
|
|
58
|
+
*/
|
|
59
|
+
aggregateSpecificObjectInfoByReference(snapshot: IHeapSnapshot, objectName: string, objectType: string, tags: string[], topNum?: number): IBaseInfo;
|
|
60
|
+
/**
|
|
61
|
+
* 指定类名/类型/标签的最短引用链聚合
|
|
62
|
+
* @param snapshot 快照
|
|
63
|
+
* @param objectType 对象类型,为空则不判断
|
|
64
|
+
* @param tags 对象标签,比如业务标签
|
|
65
|
+
* @param topNum TopN
|
|
66
|
+
*/
|
|
67
|
+
aggregateSpecificObjectInfoByClassName(snapshot: IHeapSnapshot, objectType: string, tags: string[], topNum?: number): IBaseInfo;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=ArkXAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArkXAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/ArkXAnalyzer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAwB,MAAM,cAAc,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAO,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAMH,SAAS,EAKZ,MAAM,gBAAgB,CAAC;AAGxB,oBAAY,YAAY;IACpB,gBAAgB,IAAA;IAChB,QAAQ,IAAA;CACX;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAa,SAAQ,WAAY,YAAW,SAAS;IAC9D,SAAgB,MAAM,gBAAgB;IACtC,SAAgB,GAAG,SAAqB;IACxC,gBAAuB,IAAI,oBAAoB;IAC/C,gBAAuB,IAAI,4DAA4D;IAEvF,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,MAAM,CAAqB;;IAY5B,SAAS,CAAC,MAAM,EAAE,kBAAkB;IAIrB,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;YAsD3B,UAAU;IA8DxB;;OAEG;IACI,gCAAgC,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS;IAkE/F;;;;OAIG;IACI,sCAAsC,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,SAAS;IAqE1H;;;;;OAKG;IACI,sCAAsC,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,EAAE,eAAe,GAAE,MAAW,GAAG,SAAS;IAmFxJ;;;;OAIG;IACI,sCAAsC,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,SAAS;IAoE1H;;;;;;;OAOG;IACI,sCAAsC,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAW,GAAG,SAAS;IAsE9J;;;;;;OAMG;IACI,sCAAsC,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAW,GAAG,SAAS;CAkE7I"}
|