[hibernate-dev] Memory consumption

Emmanuel Bernard emmanuel at hibernate.org
Sun May 13 05:07:08 EDT 2012


We deliberately chose to optimize hibernate ORM to be fast even if that means a bit more memory. 
We can try and avoid some objects here as there as you propose but I don't think that would be as beneficial as finding the real culprit between H3 and H4's memory consumption difference. 

On 12 mai 2012, at 22:48, Andrej Golovnin <golovnin at gmx.net> wrote:

> Hi Emmanuel,
> 
>> Andrej, I wonder if you could share with us these memory dumps privately so we could also analyze them.
> 
> I'm sorry but this is not possible. But I will give my best to find the root cause
> of this problem.
> 
> Here are my findings so far:
> 
> - In the memory dump with Hibernate 4 there are a lot of small
>  String objects. The content of these objects starts always with "$PlaceHolder$."
>  followed by a column name. This was introduced by HHH-4440.
>  Maybe interning of these strings would help. I will try it on monday.
> 
> - EntityPersisters contain SQL related strings which are never used.
>  For example: AbstractEntityPersister#temporaryIdTableDDL and 
>  #temporaryIdTableName. It exists also in Hibernate 3. I know for sure
>  that this #temporaryIdTableDDL is never used in our application
>  as the database user used by the application has no rights to create
>  temporary tables. Hibernate generates always all SQL statements
>  regardless whether they are required during the life time of an
>  application or not. Because Hibernate 3 shows the same behavior
>  in this case, I wouldn't touch it for now. But you should consider
>  it as possible improvement for the future.
> 
> - We make use of UserTypes. Although the specification of UserType 
>  requires custom implementations to be immutable, Hibernate creates
>  multiple instances, to be exactly for every occurrence of the Type annotation,
>  of the same implementation of UserType instead of reusing already
>  created instances. Hibernate 3 and 4 share here the behavior.
>  This could be also improved in the future. Personally I would prefer
>  to not use the Type annotation at all. Users of Hibernate may
>  publish they implementations of UserType by means of the ServiceLoader
>  from JDK 6.
> 
> - There are a lot of empty ArrayLists, HashMaps and HashSets which
>  are empty and have the default initial capacity (e.g. 10 by ArrayLists and 16
>  by HashMaps). But those objects exists also in the memory dump
>  with Hibernate 3. We may improve it when we change how collections
>  are created and filled in Hibernate code. I have done small changes to
>  org.hibernate.mapping.SimpleValue (see http://goo.gl/yKx5D). These
>  changes reduce the size of Configuration in my case from 16187776 bytes
>  to 15161672. The changes may look like an ugly hack and they have
>  higher resource costs (CPU, memory) during creation of SessionFactoryImpl.
>  But it should help to reduce memory if we use it wherever it makes sense.
>  What do you think?
> 
>  BTW, what is the purpose of CollectionHelper.EMPTY_LIST?
>  Why don't you use Collections.EMPTY_LIST?
> 
> That's all for now.
> 
> Best regards,
> Andrej Golovnin
> 



More information about the hibernate-dev mailing list