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


Reply via email to