[ 
https://issues.apache.org/jira/browse/SSHD-646?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ke Xu updated SSHD-646:
-----------------------
    Comment: was deleted

(was: Would you please hint which version the "original code" is so we can use 
that version? Thanks a lot.)

> ThreadGroup created in ThreadUtils is not destroyed and causes memory leak
> --------------------------------------------------------------------------
>
>                 Key: SSHD-646
>                 URL: https://issues.apache.org/jira/browse/SSHD-646
>             Project: MINA SSHD
>          Issue Type: Bug
>    Affects Versions: 1.0.0
>         Environment: linux
>            Reporter: Ke Xu
>            Assignee: Goldstein Lyor
>             Fix For: 1.2.0
>
>   Original Estimate: 8h
>  Remaining Estimate: 8h
>
> ===============
> Problem description
> ===============
> In our application, we found that more than 250M memory were occupied by 
> around 700,000 ThreadGroup objects (whose names are SshClient-nio2, timer, 
> ClientInputStreamPump). The Threads contained in these ThreadGroups and their 
> sub groups were all null.
> ===============
> Analysis
> ===============
> In ThreadUtils class there is an inner class named SshdThreadFactory. Inside 
> this class, it will create a ThreadGroup and attach it to the parent 
> Threadgroup: 
> group = new ThreadGroup(parentGroup, "sshd-" + effectiveName + "-group");
> However, the destroy() method of the ThreadGroup object is never explicitely 
> called when relevent resources are closed. 
> According to ThreadGroup API, when a ThreadGroup is created with parent 
> ThreadGroup specified, a reference to this child ThreadGroup is created in 
> the parent. The destroy() method is the only way to make the parent to remove 
> this reference. 
> Thus in case the parent ThreadGroup is main, and there is a lot of 
> ThreadGroup created, the ThreadGoup objects are not collected by the system 
> until program exits. It will eventually occupy a lot of memory.
> ===============
> Suggested solution
> ===============
> A suggested solution is to mark the ThreadGroup object as daemon after it is 
> created in SshdThreadFactory, e.g.:
>             group = new ThreadGroup(parentGroup, "sshd-" + effectiveName + 
> "-group");
>             group.setDaemon(true); 
> According to API, when a ThreadGroup is marked as daemon, it is automatically 
> destroyed when its last thread is stopped or its last thread group is 
> destroyed.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to