Proxy.isProxyClass scalability

Peter Levart peter.levart at gmail.com
Fri Jan 25 16:02:01 UTC 2013


On 01/25/2013 06:35 AM, David Holmes wrote:
> On 25/01/2013 2:36 AM, Peter Levart wrote:
>> On 01/24/2013 04:45 PM, Peter Levart wrote:
>>>>
>>>> Is there really no existing alignment gap in j.l.Class layout that a
>>>> boolean can slide into?
>>>>
>>> There might be, I will check.
>> All instance fields in j.l.Class are either references or ints.
>
> Instance are also 8-byte aligned though so does that leave any slop 
> where an extra field would not make an actual difference. (I should 
> know the answer to that after the ReflectionData changes but don't 
> recall.)
>
> Note: I have not looked at this, just considering the "add a field" 
> aspect of it.
>
> David

Here's what the Unsafe reports about current layout of j.l.Class 
(ReflectionData changes already taken into account):

32 bit pointers:

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
                      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


64 bit pointers:

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
                      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


If I add a boolean instance field "isProxy" to j.l.Class the report 
changes to:

32 bit pointers:

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
                      int classRedefinedCount     80
                      int lastAnnotationsRedefinedCount     84
                  boolean isProxy     96

java.lang.String static field offsets:

               Field Type                           Field Name Offset
               ---------- ---------- ------
      ObjectStreamField[] serialPersistentFields    104
               Comparator CASE_INSENSITIVE_ORDER    108
                     long serialVersionUID    112
                      int HASHING_SEED    120


64 bit pointers:

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
                      int classRedefinedCount    128
                      int lastAnnotationsRedefinedCount    132
                  boolean isProxy    144

java.lang.String static field offsets:

               Field Type                           Field Name Offset
               ---------- ---------- ------
      ObjectStreamField[] serialPersistentFields    152
               Comparator CASE_INSENSITIVE_ORDER    160
                     long serialVersionUID    168
                      int HASHING_SEED    176


...so it seems that in both cases, adding a boolean to j.l.Class wastes 
8 bytes per Class object :-(


Regards, Peter





More information about the core-libs-dev mailing list