On May 15, 2012, at 11:51 PM, Andrej Golovnin wrote:
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. :-(
I am not sure whether this is a problem in Hibernate as such. A lot of tests are just
written without
Locale in mind. They just makes assertions based on English. Obviously the tests could be
written
more carefully in this respect. Or do you think there is an actual bug in the runtime code
caused
by using the default Locale?
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).
Seems you are doing really a very thorough investigation of the memory consumptions.
Thanks for your help and feedback. We definitely will take your feedback onboard.
--Hardy