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.
Files changed (85) hide show
  1. package/dist/Index.d.ts +21 -0
  2. package/dist/Index.d.ts.map +1 -0
  3. package/dist/Index.js +65 -0
  4. package/dist/analyzer/AnalysisInfo.d.ts +112 -0
  5. package/dist/analyzer/AnalysisInfo.d.ts.map +1 -0
  6. package/dist/analyzer/AnalysisInfo.js +217 -0
  7. package/dist/analyzer/ArkAnalyzer.d.ts +30 -0
  8. package/dist/analyzer/ArkAnalyzer.d.ts.map +1 -0
  9. package/dist/analyzer/ArkAnalyzer.js +52 -0
  10. package/dist/analyzer/ArkCmpCfg.d.ts +15 -0
  11. package/dist/analyzer/ArkCmpCfg.d.ts.map +1 -0
  12. package/dist/analyzer/ArkCmpCfg.js +15 -0
  13. package/dist/analyzer/ArkCompareAnalyzer.d.ts +52 -0
  14. package/dist/analyzer/ArkCompareAnalyzer.d.ts.map +1 -0
  15. package/dist/analyzer/ArkCompareAnalyzer.js +144 -0
  16. package/dist/analyzer/ArkLeakAnalyzer.d.ts +14 -0
  17. package/dist/analyzer/ArkLeakAnalyzer.d.ts.map +1 -0
  18. package/dist/analyzer/ArkLeakAnalyzer.js +18 -0
  19. package/dist/analyzer/ArkSerializer.d.ts +18 -0
  20. package/dist/analyzer/ArkSerializer.d.ts.map +1 -0
  21. package/dist/analyzer/ArkSerializer.js +155 -0
  22. package/dist/analyzer/ArkStatAnalyzer.d.ts +56 -0
  23. package/dist/analyzer/ArkStatAnalyzer.d.ts.map +1 -0
  24. package/dist/analyzer/ArkStatAnalyzer.js +224 -0
  25. package/dist/analyzer/ArkStatCfg.d.ts +42 -0
  26. package/dist/analyzer/ArkStatCfg.d.ts.map +1 -0
  27. package/dist/analyzer/ArkStatCfg.js +42 -0
  28. package/dist/analyzer/ArkTracePath.d.ts +90 -0
  29. package/dist/analyzer/ArkTracePath.d.ts.map +1 -0
  30. package/dist/analyzer/ArkTracePath.js +245 -0
  31. package/dist/analyzer/ArkTracer.d.ts +17 -0
  32. package/dist/analyzer/ArkTracer.d.ts.map +1 -0
  33. package/dist/analyzer/ArkTracer.js +27 -0
  34. package/dist/analyzer/ArkXAnalyzer.d.ts +69 -0
  35. package/dist/analyzer/ArkXAnalyzer.d.ts.map +1 -0
  36. package/dist/analyzer/ArkXAnalyzer.js +616 -0
  37. package/dist/analyzer/IAnalyzer.d.ts +25 -0
  38. package/dist/analyzer/IAnalyzer.d.ts.map +1 -0
  39. package/dist/analyzer/IAnalyzer.js +2 -0
  40. package/dist/file/FileReader.d.ts +51 -0
  41. package/dist/file/FileReader.d.ts.map +1 -0
  42. package/dist/file/FileReader.js +110 -0
  43. package/dist/file/FileService.d.ts +23 -0
  44. package/dist/file/FileService.d.ts.map +1 -0
  45. package/dist/file/FileService.js +65 -0
  46. package/dist/file/FileWriter.d.ts +82 -0
  47. package/dist/file/FileWriter.d.ts.map +1 -0
  48. package/dist/file/FileWriter.js +160 -0
  49. package/dist/report/Reporter.d.ts +27 -0
  50. package/dist/report/Reporter.d.ts.map +1 -0
  51. package/dist/report/Reporter.js +61 -0
  52. package/dist/report/templates/template.d.ts +3 -0
  53. package/dist/report/templates/template.d.ts.map +1 -0
  54. package/dist/report/templates/template.js +106 -0
  55. package/dist/shell/DeviceShell.d.ts +96 -0
  56. package/dist/shell/DeviceShell.d.ts.map +1 -0
  57. package/dist/shell/DeviceShell.js +180 -0
  58. package/dist/shell/Shell.d.ts +52 -0
  59. package/dist/shell/Shell.d.ts.map +1 -0
  60. package/dist/shell/Shell.js +79 -0
  61. package/dist/types/Constants.d.ts +15 -0
  62. package/dist/types/Constants.d.ts.map +1 -0
  63. package/dist/types/Constants.js +18 -0
  64. package/dist/types/LeakTypes.d.ts +18 -0
  65. package/dist/types/LeakTypes.d.ts.map +1 -0
  66. package/dist/types/LeakTypes.js +2 -0
  67. package/dist/types/OhosTypes.d.ts +74 -0
  68. package/dist/types/OhosTypes.d.ts.map +1 -0
  69. package/dist/types/OhosTypes.js +83 -0
  70. package/dist/utils/Common.d.ts +14 -0
  71. package/dist/utils/Common.d.ts.map +1 -0
  72. package/dist/utils/Common.js +38 -0
  73. package/dist/utils/Finder.d.ts +163 -0
  74. package/dist/utils/Finder.d.ts.map +1 -0
  75. package/dist/utils/Finder.js +355 -0
  76. package/dist/utils/Loader.d.ts +30 -0
  77. package/dist/utils/Loader.d.ts.map +1 -0
  78. package/dist/utils/Loader.js +71 -0
  79. package/dist/utils/Log.d.ts +140 -0
  80. package/dist/utils/Log.d.ts.map +1 -0
  81. package/dist/utils/Log.js +177 -0
  82. package/dist/utils/Output.d.ts +126 -0
  83. package/dist/utils/Output.d.ts.map +1 -0
  84. package/dist/utils/Output.js +225 -0
  85. 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"}