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

Reply via email to