[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2481?page=c...
]
Scott Marlow commented on HHH-2481:
-----------------------------------
My next step is to evaluate whether we could fix the root issue differently (or work
around it), that being HHH-1293. In the original code, we passed the instance in directly
which didn't always work on some platforms (especially Linux). At the very least, we
should clear the ThreadLocalStorage reference before returning as your patch does.
In your example above, is the potential of the leak really that high? I wouldn't
expect 15,000 objects leaked. Correct me if I'm wrong, but I would expect one TLS
slot per thread to hold a reference. If you have 100 threads, that is a max of 100
objects leaked. Unless a collection is stored in each TLS slot and then the potential is
higher. Either way, we should fix the leak.
http://forum.hibernate.org/viewtopic.php?t=947902 seems to discuss this issue as well.
Big memory leak in the use of CGLIB
-----------------------------------
Key: HHH-2481
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2481
Project: Hibernate3
Type: Bug
Components: core
Versions: 3.2.2
Environment: Hibernate 3.2.2
MySQL 5.1
Reporter: Paul Malolepsy
Assignee: Scott Marlow
Priority: Critical
Attachments: fix.diff
Original Estimate: 5 minutes
Remaining: 5 minutes
The way CGLIBLazyInitializer is creating proxies is resulting in a potentially massive
memory leak.
In CGLIBLazyInitializer.getProxy() just before the proxy is instantiated, a call is made
to Enhancer.registerCallbacks() passing in the instance of CGLIBLazyInitializer that will
manage the proxy. This variable is stored in a static ThreadLocal on the CGLIB created
persistentClass so that any subsequent objects instantiated will get this callback class.
The problem is that once this ThreadLocal is set, it is never cleared, so it will stay
around (together with the object it's managing, and whatever object graph it may be
connected to) until the next time a proxy is created for that type on that thread.
For our application we have about 150 different proxy types, and our app can have over
100 threads. This results in potentially 15,000 proxy objects and their graphs stuck in
memory.
The fix for this is simple. Just make another call the Enhancer.registerCallbacks() with
a null callback arg, right after the proxy class is instantiated:
Enhancer.registerCallbacks(factory, null);
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira