[infinispan-dev] Cost of inheritance
Bela Ban
bban at redhat.com
Fri Nov 15 03:10:28 EST 2013
Excellent idea of moving fields between parent/sub classes !
Which tool did you use to dump the layout of a class ? Following Shane's
ref, "Java Object Layout" has been moved...
I'd like to take a look at some JGroups classes and see if I can reorder
fields (although I don't use a lot of inheritance)
On 11/14/13 10:18 PM, Sanne Grinovero wrote:
> In a particular benchmark I'm running, the bottleneck of my system
> seems to be the object allocation rate.
>
> More specifically, in just some minutes I've got about 55GB allocated
> just of instances of SingleKeyNonTxInvocationContext
> (yes I literally mean GigaBytes)
>
> and 45GB of org.infinispan.commands.read.GetKeyValueCommand.
>
> To be clear: these high amounts are caused only by the "shallow" class
> instance of these two types, not counting key nor value sizes being
> actually moved into/out Infinispan.
> Of course it means we're talking about many of these instances, but
> also the size of each of them matters, so I've been taking a look at
> their definitions.
>
> Running 64-bit HotSpot VM.
> Using compressed references with 3-bit shift.
> Objects are 8 bytes aligned.
>
> # org.infinispan.context.SingleKeyNonTxInvocationContext
>
> offset size type description
> 0 12 (assumed to be the object header + first
> field alignment)
> 12 1 byte AbstractInvocationContext.contextFlags
> 13 3 (alignment/padding gap)
> 16 4 Address AbstractInvocationContext.origin
> 20 4 WeakReference AbstractInvocationContext.classLoader
> 24 1 boolean SingleKeyNonTxInvocationContext.isOriginLocal
> 25 1 boolean SingleKeyNonTxInvocationContext.isLocked
> 26 2 (alignment/padding gap)
> 28 4 Object SingleKeyNonTxInvocationContext.key
> 32 4 CacheEntry SingleKeyNonTxInvocationContext.cacheEntry
> 36 4 (loss due to the next object alignment)
> 40 (object boundary, size estimate)
>
> I notice two things in here:
> a) we could refactor maybe some code to have less fields in such a
> hot allocated type
> b) Lots of space is being wasted in padding!
>
> If you count the bytes lost because of the various alignment rules: 9
> That's almost 25%, about 13GB of used memory!
>
> Why are there two separate object alignment gaps? That's because the
> fields of the parent class need to be grouped, then the child class's
> fields are aligned after it.
> In other words, if I move the fields from the parent class to the
> bottom class I get:
>
> org.infinispan.context.SingleKeyNonTxInvocationContext
> offset size type description
> 0 12 (assumed to be the object header + first
> field alignment)
> 12 1 byte SingleKeyNonTxInvocationContext.contextFlags
> 13 1 boolean SingleKeyNonTxInvocationContext.isOriginLocal
> 14 1 boolean SingleKeyNonTxInvocationContext.isLocked
> 15 1 (alignment/padding gap)
> 16 4 Address SingleKeyNonTxInvocationContext.origin
> 20 4 ClassLoader SingleKeyNonTxInvocationContext.classLoader
> 24 4 Object SingleKeyNonTxInvocationContext.key
> 28 4 CacheEntry SingleKeyNonTxInvocationContext.cacheEntry
> 32 (object boundary, size estimate)
>
> which recovers 20% ..
>
> Looking forward to see simpler class hierarchies in the code ;-)
>
> Sanne
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>
--
Bela Ban, JGroups lead (http://www.jgroups.org)
More information about the infinispan-dev
mailing list