1+ package com .example .memviz .model ;
2+
3+ import cn .hutool .core .util .RandomUtil ;
4+
5+ import java .util .*;
6+
7+ public class GraphModel {
8+ public static class Node {
9+ public String id ; // objectId 或 class@id
10+ public String label ; // 类名(短)
11+ public String className ; // 类名(全)
12+ public long shallowSize ; // 浅表大小
13+ public long deepSize ; // 深度大小
14+ public String category ; // JDK/第三方/业务
15+ public int instanceCount ; // 该类的实例总数
16+ public String formattedSize ; // 格式化的浅表大小显示
17+ public String formattedDeepSize ; // 格式化的深度大小显示
18+ public String packageName ; // 包名
19+ public boolean isArray ; // 是否为数组类型
20+ public String objectType ; // 对象类型描述
21+ public List <FieldInfo > fields ; // 对象的字段信息
22+
23+ public Node (String id , String label , String className , long shallowSize , String category ) {
24+ this .id = id ;
25+ this .label = label ;
26+ this .className = className ;
27+ this .shallowSize = shallowSize ;
28+ this .category = category ;
29+ this .fields = new ArrayList <>();
30+ }
31+
32+ // 增强构造函数
33+ public Node (String id , String label , String className , long shallowSize , String category ,
34+ int instanceCount , String formattedSize , String packageName , boolean isArray , String objectType ,
35+ long deepSize , String formattedDeepSize ) {
36+ this .id = id ;
37+ this .label = label ;
38+ this .className = className ;
39+ this .shallowSize = shallowSize ;
40+ this .deepSize = deepSize ;
41+ this .category = category ;
42+ this .instanceCount = instanceCount ;
43+ this .formattedSize = formattedSize ;
44+ this .formattedDeepSize = formattedDeepSize ;
45+ this .packageName = packageName ;
46+ this .isArray = isArray ;
47+ this .objectType = objectType ;
48+ this .fields = new ArrayList <>();
49+ }
50+ }
51+
52+ public static class Link {
53+ public String source ;
54+ public String target ;
55+ public String field ; // 通过哪个字段/元素引用
56+
57+ public Link (String s , String t , String field ) {
58+ this .source = s ;
59+ this .target = t ;
60+ this .field = field ;
61+ }
62+ }
63+
64+ // Top100类统计信息
65+ public static class TopClassStat {
66+ public String className ;
67+ public String shortName ;
68+ public String packageName ;
69+ public String category ;
70+ public int instanceCount ; // 实例数量
71+ public long totalSize ; // 该类所有实例的总内存(浅表大小)
72+ public String formattedTotalSize ; // 格式化的总内存
73+ public long totalDeepSize ; // 该类所有实例的总深度大小
74+ public String formattedTotalDeepSize ; // 格式化的总深度大小
75+ public long avgSize ; // 平均每个实例大小(浅表)
76+ public String formattedAvgSize ; // 格式化的平均大小
77+ public long avgDeepSize ; // 平均每个实例深度大小
78+ public String formattedAvgDeepSize ; // 格式化的平均深度大小
79+ public int rank ; // 排名
80+ public List <ClassInstance > topInstances ; // 该类中内存占用最大的实例列表
81+
82+ public TopClassStat (String className , String shortName , String packageName , String category ,
83+ int instanceCount , long totalSize , String formattedTotalSize ,
84+ long totalDeepSize , String formattedTotalDeepSize ,
85+ long avgSize , String formattedAvgSize ,
86+ long avgDeepSize , String formattedAvgDeepSize ,
87+ int rank , List <ClassInstance > topInstances ) {
88+ this .className = className ;
89+ this .shortName = shortName ;
90+ this .packageName = packageName ;
91+ this .category = category ;
92+ this .instanceCount = instanceCount ;
93+ this .totalSize = totalSize ;
94+ this .formattedTotalSize = formattedTotalSize ;
95+ this .totalDeepSize = totalDeepSize ;
96+ this .formattedTotalDeepSize = formattedTotalDeepSize ;
97+ this .avgSize = avgSize ;
98+ this .formattedAvgSize = formattedAvgSize ;
99+ this .avgDeepSize = avgDeepSize ;
100+ this .formattedAvgDeepSize = formattedAvgDeepSize ;
101+ this .rank = rank ;
102+ this .topInstances = topInstances != null ? topInstances : new ArrayList <>();
103+ }
104+ }
105+
106+ // 类的实例信息
107+ public static class ClassInstance {
108+ public String id ;
109+ public long size ; // 浅表大小
110+ public String formattedSize ; // 格式化的浅表大小
111+ public long retainedSize ; // 深度大小(保留大小)
112+ public String formattedRetainedSize ; // 格式化的深度大小
113+ public int rank ; // 在该类中的排名
114+ public String packageName ; // 包名
115+ public String objectType ; // 对象类型
116+ public boolean isArray ; // 是否数组
117+ public double sizePercentInClass ; // 在该类中的内存占比
118+ public List <FieldInfo > fields ; // 添加字段信息列表
119+
120+ public ClassInstance (String id , long size , String formattedSize ,
121+ long retainedSize , String formattedRetainedSize , int rank ,
122+ String packageName , String objectType , boolean isArray , double sizePercentInClass ) {
123+ this .id = id ;
124+ this .size = size ;
125+ this .formattedSize = formattedSize ;
126+ this .retainedSize = retainedSize ;
127+ this .formattedRetainedSize = formattedRetainedSize ;
128+ this .rank = rank ;
129+ this .packageName = packageName ;
130+ this .objectType = objectType ;
131+ this .isArray = isArray ;
132+ this .sizePercentInClass = sizePercentInClass ;
133+ this .fields = new ArrayList <>();
134+ }
135+ }
136+
137+ public List <Node > nodes = new ArrayList <>();
138+ public List <Link > links = new ArrayList <>();
139+ public List <TopClassStat > top100Classes = new ArrayList <>(); // Top100类统计列表
140+ public int totalObjects ; // 总对象数
141+ public long totalMemory ; // 总内存占用
142+ public String formattedTotalMemory ; // 格式化的总内存
143+
144+ // 字段信息类,用于存储对象的属性信息
145+ public static class FieldInfo {
146+ public String name ; // 字段名称
147+ public String type ; // 字段类型
148+ public String value ; // 字段值(字符串表示)
149+ public long size ; // 字段浅表大小(字节)
150+ public String formattedSize ; // 格式化的浅表大小
151+ public long retainedSize ; // 字段深度大小(保留大小)
152+ public String formattedRetainedSize ; // 格式化的深度大小
153+ public double sizePercent ; // 在对象中的占比(基于浅表大小)
154+ public double retainedSizePercent ; // 在对象中的深度大小占比
155+ public boolean isPrimitive ; // 是否为基本类型
156+ public boolean isReference ; // 是否为引用类型
157+
158+ public FieldInfo (String name , String type , String value , long size ,
159+ String formattedSize , long retainedSize , String formattedRetainedSize ,
160+ double sizePercent , double retainedSizePercent ,
161+ boolean isPrimitive , boolean isReference ) {
162+ this .name = name ;
163+ this .type = type ;
164+ this .value = value ;
165+ this .size = size ;
166+ this .formattedSize = formattedSize ;
167+ this .retainedSize = retainedSize ;
168+ this .formattedRetainedSize = formattedRetainedSize ;
169+ this .sizePercent = sizePercent ;
170+ this .retainedSizePercent = retainedSizePercent ;
171+ this .isPrimitive = isPrimitive ;
172+ this .isReference = isReference ;
173+ }
174+
175+ // 获取字段浅表大小
176+ public long getSize () {
177+ return size ;
178+ }
179+
180+ // 获取字段深度大小
181+ public long getRetainedSize () {
182+ return retainedSize ;
183+ }
184+ }
185+ }
0 commit comments