37
37
import java .util .List ;
38
38
import java .util .Map ;
39
39
import java .util .regex .Pattern ;
40
-
40
+ import static org . graalvm . visualvm . lib . jfluid . heap . ObjectSizeSettings .*;
41
41
42
42
/**
43
43
*
@@ -47,8 +47,9 @@ class ClassDumpSegment extends TagBounds {
47
47
//~ Instance fields ----------------------------------------------------------------------------------------------------------
48
48
49
49
HprofHeap hprofHeap ;
50
+ final ObjectSizeSettings sizeSettings ;
50
51
// Map <JavaClass represeting array,Long - allInstanceSize>
51
- Map <JavaClass ,Long > arrayMap ;
52
+ Map <JavaClass ,long [] > arrayMap ;
52
53
final int classIDOffset ;
53
54
final int classLoaderIDOffset ;
54
55
final int constantPoolSizeOffset ;
@@ -57,7 +58,6 @@ class ClassDumpSegment extends TagBounds {
57
58
final int fieldTypeOffset ;
58
59
final int fieldValueOffset ;
59
60
final int instanceSizeOffset ;
60
- final int minimumInstanceSize ;
61
61
final int protectionDomainIDOffset ;
62
62
final int reserved1 ;
63
63
final int reserver2 ;
@@ -69,6 +69,7 @@ class ClassDumpSegment extends TagBounds {
69
69
Map <JavaClass ,List <Field >> fieldsCache ;
70
70
private List <JavaClass > classes ;
71
71
private Map <Integer ,JavaClass > primitiveArrayMap ;
72
+ private Map <JavaClass ,Integer > primitiveTypeMap ;
72
73
73
74
//~ Constructors -------------------------------------------------------------------------------------------------------------
74
75
@@ -77,6 +78,7 @@ class ClassDumpSegment extends TagBounds {
77
78
78
79
int idSize = heap .dumpBuffer .getIDSize ();
79
80
hprofHeap = heap ;
81
+ sizeSettings = new ObjectSizeSettings (hprofHeap );
80
82
// initialize offsets
81
83
classIDOffset = 1 ;
82
84
stackTraceSerialNumberOffset = classIDOffset + idSize ;
@@ -94,8 +96,6 @@ class ClassDumpSegment extends TagBounds {
94
96
fieldValueOffset = fieldTypeOffset + 1 ;
95
97
96
98
fieldSize = fieldTypeOffset + 1 ;
97
-
98
- minimumInstanceSize = 2 * idSize ;
99
99
100
100
fieldsCache = Collections .synchronizedMap (new FieldsCache ());
101
101
}
@@ -149,8 +149,11 @@ Collection<JavaClass> getJavaClassesByRegExp(String regexp) {
149
149
return result ;
150
150
}
151
151
152
- int getMinimumInstanceSize () {
153
- return minimumInstanceSize ;
152
+ long getArraySize (byte type , int elements ) {
153
+ long size ;
154
+ long elementSize = sizeSettings .getElementSize (type );
155
+ size = sizeSettings .getMinimumInstanceSize () + ARRAY_OVERHEAD + (elementSize * elements );
156
+ return alignObjectSize (size );
154
157
}
155
158
156
159
ClassDump getPrimitiveArrayClass (byte type ) {
@@ -175,30 +178,27 @@ Map getClassIdToClassMap() {
175
178
176
179
void addInstanceSize (ClassDump cls , int tag , long instanceOffset ) {
177
180
if ((tag == HprofHeap .OBJECT_ARRAY_DUMP ) || (tag == HprofHeap .PRIMITIVE_ARRAY_DUMP )) {
178
- Long sizeLong = arrayMap .get (cls );
181
+ long sizeLong [] = arrayMap .get (cls );
179
182
long size = 0 ;
180
183
HprofByteBuffer dumpBuffer = hprofHeap .dumpBuffer ;
181
184
int idSize = dumpBuffer .getIDSize ();
182
185
long elementsOffset = instanceOffset + 1 + idSize + 4 ;
183
186
184
- if (sizeLong != null ) {
185
- size = sizeLong .longValue ();
187
+ if (sizeLong == null ) {
188
+ sizeLong = new long [OBJECT_ALIGNMENT +1 ];
189
+ arrayMap .put (cls , sizeLong );
186
190
}
187
191
188
192
int elements = dumpBuffer .getInt (elementsOffset );
189
- int elSize ;
190
-
191
- if (tag == HprofHeap .PRIMITIVE_ARRAY_DUMP ) {
192
- elSize = hprofHeap .getValueSize (dumpBuffer .get (elementsOffset + 4 ));
193
- } else {
194
- elSize = idSize ;
195
- }
196
-
197
- size += (getMinimumInstanceSize () + ArrayDump .HPROF_ARRAY_OVERHEAD + (((long )elements ) * elSize ));
198
- arrayMap .put (cls , Long .valueOf (size ));
193
+ sizeLong [OBJECT_ALIGNMENT ] += elements /OBJECT_ALIGNMENT ;
194
+ sizeLong [elements %OBJECT_ALIGNMENT ]++;
199
195
}
200
196
}
201
197
198
+ long alignObjectSize (long size ) {
199
+ return (size +OBJECT_ALIGNMENT -1 ) & (~(OBJECT_ALIGNMENT -1 ));
200
+ }
201
+
202
202
synchronized List <JavaClass > createClassCollection () {
203
203
if (classes != null ) {
204
204
return classes ;
@@ -233,6 +233,7 @@ synchronized List<JavaClass> createClassCollection() {
233
233
void extractSpecialClasses () {
234
234
ClassDump java_lang_Object = null ;
235
235
primitiveArrayMap = new HashMap ();
236
+ primitiveTypeMap = new HashMap ();
236
237
237
238
Iterator classIt = classes .iterator ();
238
239
@@ -285,10 +286,15 @@ void extractSpecialClasses() {
285
286
286
287
if (typeObj != null ) {
287
288
primitiveArrayMap .put (typeObj , jcls );
289
+ primitiveTypeMap .put (jcls , typeObj );
288
290
}
289
291
}
290
292
if (java_lang_Object != null ) {
291
- newSize = java_lang_Object .getRawInstanceSize () > 0 ;
293
+ int objectSize = java_lang_Object .getRawInstanceSize ();
294
+ if (objectSize > 0 ) {
295
+ newSize = true ;
296
+ sizeSettings .setMinimumInstanceSize (objectSize );
297
+ }
292
298
}
293
299
}
294
300
@@ -303,10 +309,12 @@ void writeToStream(DataOutputStream out) throws IOException {
303
309
ClassDump classDump = (ClassDump ) classes .get (i );
304
310
305
311
classDump .writeToStream (out );
306
- Long size = arrayMap .get (classDump );
312
+ long [] size = arrayMap .get (classDump );
307
313
out .writeBoolean (size != null );
308
314
if (size != null ) {
309
- out .writeLong (size .longValue ());
315
+ for (int si =0 ; si <size .length ; si ++) {
316
+ out .writeLong (size [si ]);
317
+ }
310
318
}
311
319
}
312
320
}
@@ -323,14 +331,23 @@ void writeToStream(DataOutputStream out) throws IOException {
323
331
ClassDump c = new ClassDump (this , dis .readLong (), dis );
324
332
cls .add (c );
325
333
if (dis .readBoolean ()) {
326
- Long size = Long .valueOf (dis .readLong ());
334
+ long [] size = new long [OBJECT_ALIGNMENT +1 ];
335
+ for (int si = 0 ; si < size .length ; si ++) {
336
+ size [si ] = dis .readLong ();
337
+ }
327
338
arrayMap .put (c , size );
328
339
}
329
340
}
330
341
classes = Collections .unmodifiableList (cls );
331
342
}
332
343
}
333
344
345
+ int getArrayElSize (ClassDump cls ) {
346
+ Integer typeObj = primitiveTypeMap .get (cls );
347
+ byte type = typeObj != null ? typeObj .byteValue () : HprofHeap .OBJECT ;
348
+ return sizeSettings .getElementSize (type );
349
+ }
350
+
334
351
private static class FieldsCache extends LinkedHashMap {
335
352
private static final int SIZE = 500 ;
336
353
0 commit comments