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).
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