Proxy.isProxyClass scalability (original) (raw)

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