[
https://issues.apache.org/jira/browse/JCR-1216?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Thomas Mueller updated JCR-1216:
--------------------------------
Attachment: weakReferencePatch.txt
This is a prove-of-concept patch that solves the problem.
It uses weak references to SessionImpl in
TransientRepository.sessions,
StateChangeDispatcher.listeners, and
StateChangeDispatcher.nsListeners.
The StateChangeDispatcher changes are a bit ugly,
and SessionImpl.finalize needs to be changed.
The following test case works now:
Repository rep = new TransientRepository();
while(true) {
SimpleCredentials sc = new SimpleCredentials("", new char[0]);
rep.login(sc);
}
> Unreferenced sessions should get garbage collected
> --------------------------------------------------
>
> Key: JCR-1216
> URL:
https://issues.apache.org/jira/browse/JCR-1216> Project: Jackrabbit
> Issue Type: Improvement
> Components: jackrabbit-core
> Reporter: Thomas Mueller
> Assignee: Thomas Mueller
> Attachments: userSessionPatch.txt, weakReferencePatch.txt
>
>
> If an application opens many sessions and doesn't close them, they are never garbage collected. After some time, the virtual machine will run out of memory. This code will run out of memory after a few thousand logins:
> Repository rep = new TransientRepository();
> for (int i = 0; ; i++) {
> rep.login(new SimpleCredentials("", new char[0]));
> }
> Using a finalizer to close SessionImpl doesn't work, because it seems there are references from the (hard referenced part of the cache) to the SessionImpl objects. Maybe it is possible to remove those references, or change them to weak references.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.