[hibernate-dev] Memory consumption

Scott Marlow smarlow at redhat.com
Wed May 16 08:43:42 EDT 2012


On 05/15/2012 05:51 PM, Andrej Golovnin wrote:
> Hi all,
>
> finally I have found the cause of this problem.
>
> But before I describe what caused it, I would like to make two suggestions:
>
> 1. Consider avoiding usage of String#toLowerCase() and String#toUpperCase()
>      without specifying a Locale. Users running Hibernate on systems with Turkish as default
>      locale may see unexpected results. In Turkish there are two lowercase letters
>      \u0069 ‘i’ and \u0131 ‘ı’ (dotless ‘I’). And they are totally unrelated. Their uppercase
>      versions are \u0130 ‘İ’ (capital letter ‘I’ with dot above it) and \u0049 ‘I’.
>      So if you convert \u0049 ‘I’ to lower case and the system uses Turkish as default
>      locale, you will get \u0131 ‘ı’ (dotless ‘I’) and not 'i', e.g. 'MY_COLUMN_I' would be converted
>      to 'my_column_ı' and not 'my_column_i'. If you run Hibernate tests with Turkish as default locale
>      some tests fail. I have for now no idea, what locale should be used instead of the default
>      one. :-(
>
> 2. Do not use HashMap#clone(). If the JVM is started with the option
>      -XX:+AggressiveOpts, the HashMap#clone() may produce memory leaks.
>      See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7042126.
>      IMHO the copy-constructor should be as fast as #clone().
>
> Now to the memory consumption problem. The problem was introduced with the fix
> of https://hibernate.onjira.com/browse/HHH-4546. Additional LockModes lead
> to increased memory consumption. When I comment the changes made by
> HHH-4546 in the method AbstractEntityPersister#createLoaders() out, I get nearly
> the same size for SessionFactoryImpl as it was in Hibernate 3.2.7
> (see http://goo.gl/UB47c).

Nice find!  Could you drill into one of the LockMode loaders and see 
what the larger objects referenced by that are?

>
> I have created a small patch to solve/avoid this problem. It creates loaders lazily for some
> of LockModes (see http://goo.gl/wUn4w). With this changes the memory consumption
> of SessionFactoryImpl right after server startup drops from ca. 370MB to
> ca. 132MB (see http://goo.gl/GQw3p).
>
> What do you think about this changes?
> Btw it passes all tests. :-)
>
> One more thing: Could we have a property similar to "hibernate.listeners.envers.autoRegister"
> for Validator? I would like to disable Validator completely as it produces too much garbage
> (look at the pictures) when the application is deployed.
>
> Best regards
> Andrej Golovnin
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev



More information about the hibernate-dev mailing list