Proxy.isProxyClass scalability
Vitaly Davidovich
vitalyd at gmail.com
Fri Jan 25 16:04:52 UTC 2013
That's unfortunate. Can you steal a bit in one of the int fields? E.g.
lastAnnotationsRedefinedCount surely doesn't need the full range right? :)
Sent from my phone
On Jan 25, 2013 11:02 AM, "Peter Levart" <peter.levart at gmail.com> wrote:
> 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