[hibernate-dev] Runtime efficiency: sharing some profiling output

Steve Ebersole steve at hibernate.org
Tue Oct 2 15:43:51 EDT 2012


See comments inline...

On Tue 02 Oct 2012 01:13:39 PM CDT, Sanne Grinovero wrote:

> # IdentityMap
> Some performance is lost in the well known
> org.hibernate.engine.internal.StatefulPersistenceContext; especially
> the IdentityMap and it's need for System.identityHashCode is
> demanding.
> New in this run is the surprising cost of #clear() : 0,5% CPU.. not
> alarming, but it looks like I can blame again IdentityMap,
> specifically: concurrentEntries.

We have discussed the IdentityMap concerns quite a few times in past 
few weeks.  For background, this is mainly a problem with 
PersistenceContext and the fact that it holds a few identity-based 
(rather than equality-based) Maps to track various states related to 
entities and collections.  The bottleneck here is actually 
System#identityHashCode we have since found, which is a native call.  
Same thing for Object#hashCode, even if we could consistently rely on 
it.

This can be at least partially alleviated by moving to bytecode 
enhancement and offloading the state maintained in PersistenceContext 
to the enhanced entity classes.  Of course this is a non-simple change 
and we really do not know what other performance problems this might 
then cause.


> # DefaultEntityAliases.intern
> Why are we interning this?
> org.hibernate.loader.DefaultEntityAliases.intern(String[])
> If they are constants, I guess they could be reused rather than
> re-computed all the time.. in fact, see next point:
>
> # Aliases and other string generations
> It seems Hibernate ORM is generating property aliases and other little
> Strings all the time; this test isn't using any HQL, just direct
> loading of entities via primary keys or by following relations from
> other managed entities.

Isn't there a point where interning becomes wasteful?  Surely there 
must be.  What is that tipping point?


>   # org.hibernate.type.descriptor.sql.IntegerTypeDescriptor.getExtractor(JavaTypeDescriptor<X>)
>   Could we avoid returning a new instance on each demand ?

I am not sure how since in many cases we rely on being able to swap 
those incoming JavaTypeDescriptors.  Suggestions welcome.


>   # iterators on
> org.hibernate.internal.util.collections.ConcurrentReferenceHashMap.ConcurrentReferenceHashMap
>   Why are we having a concurrent Map in the StatefulPersistenceContext
> ? I thought this class wasn't meant to be shared among multiple
> threads?

As far as I know, the important piece is more the references.  AFAIK 
there are no non-concurrent reference map implementations available in 
any of our current dependencies.



--
steve at hibernate.org
http://hibernate.org


More information about the hibernate-dev mailing list