Hi David, I think I already have a kind of answer. You wrote it in "RFR: 8005232 (JEP-149) Class Instance size reduction": On 01/06/2013 11:46 PM, David Holmes wrote:
In Java 8, using a 32-bit example, a java.lang.Class instance is 112 bytes consisting of:
- 8 byte object header - 20 declared fields (mostly references, some int) *- 5 injected fields (3 references, 2 ints) *
That gives: 8 + (20*4) +(5*4) = 108 bytes. But as we need 8-byte alignment that increases to 112 bytes.
Regards, Peter On 01/25/2013 05:34 PM, Peter Levart wrote:
Hi David,
I was surprised to see Usafe report these offsets. See below:
java.lang.Class *instance* field offsets:
Field Type Field Name Offset ---------- ---------- ------ Constructor cachedConstructor 12 Class newInstanceCallerCache 16 String name 20 SoftReference reflectionData 24 ClassRepository genericInfo 28 Object[] enumConstants 32 Map enumConstantDirectory 36 Map annotations 40 Map declaredAnnotations 44 AnnotationType annotationType 48 ClassValueMap classValueMap *52*
Why the *24 bytes* gap between /classValueMap/ and /classRedefinedCount/ fields?
int classRedefinedCount *80* int lastAnnotationsRedefinedCount 84
java.lang.String *static* field offsets:
Field Type Field Name Offset ---------- ---------- ------ ObjectStreamField[] serialPersistentFields 96 Comparator CASE_INSENSITIVE_ORDER 100 long serialVersionUID 104 int HASHING_SEED 112
The 64 bit pointers variant:
java.lang.Class instance field offsets:
Field Type Field Name Offset ---------- ---------- ------ Constructor cachedConstructor 16 Class newInstanceCallerCache 24 String name 32 SoftReference reflectionData 40 ClassRepository genericInfo 48 Object[] enumConstants 56 Map enumConstantDirectory 64 Map annotations 72 Map declaredAnnotations 80 AnnotationType annotationType 88 ClassValueMap classValueMap *96*
*24 bytes* gap here too!
int classRedefinedCount *128* int lastAnnotationsRedefinedCount 132
java.lang.String static field offsets:
Field Type Field Name Offset ---------- ---------- ------ ObjectStreamField[] serialPersistentFields 144 Comparator CASE_INSENSITIVE_ORDER 152 long serialVersionUID 160 int HASHING_SEED 168
Might it be that the "classRedefinedCount" field offset is fixed somehow in VM, since the VM has to update it? Should there be VM changes also to accomodate ReflectionData changes? Are there VM fields inserted here that don't have a Java mapping?
Regards, Peter