[ https://issues.apache.org/jira/browse/SLING-4676?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Julian Sedding updated SLING-4676: ---------------------------------- Attachment: SLING-4676-jsedding-1.patch I attached a patch that allows pro-active expiry of threads in a small extension of {{ThreadPoolExecutor}}. The patch is meant to gather feedback and therefore does not yet hook the implementation into Sling's {{DefaultThreadPool}}. The mechanism is based on two observations: - Threads in which an exception is thrown are replaced by {{ThreadPoolExecutor}} - Throwing an exception in the {{ThreadPoolExecutor#afterExecute()}} method, designed to be overridden, does not influence the outcome of an execution. The implementation I suggest uses these two observations to throw an exception from {{afterExecute()}} when a thread has expired. The {{beforeExecute()}} method is used to record the first time a thread is used and it also hooks up an {{UncaughtExceptionHandler}} in order to swallow the control-flow exception thrown by {{afterExecute()}}. Handling of all other exceptions is delegated to the original handler. This approach can be considered hacky. However, the only other option I could think of was to decorate a pair of {{ThreadPoolExecutors}} and shift the work from one to the other periodically to allow killing all threads in the inactive pool. To me such an implementation seems to be a lot more complex, however. [~cziegeler], [~baedke], I would appreciate hearing if you have any doubts before I finish off the integration and commit the changes. Thanks! > Clean up threads or refresh threads when put back into the pool > --------------------------------------------------------------- > > Key: SLING-4676 > URL: https://issues.apache.org/jira/browse/SLING-4676 > Project: Sling > Issue Type: Improvement > Components: Commons > Reporter: Carsten Ziegeler > Fix For: Commons Threads 3.2.2 > > Attachments: SLING-4676-jsedding-1.patch, sling-4676-provisional.patch > > > A thread from the pool might use thread locals which are - for whatever > reason - not cleaned up, when the thread is put back into the pool. > This can lead to memory leaks. > We should protect against this. > Unfortunately there is no official API to clean up thread locals. There are > solutions out there using reflection. > Another option is to simply discard the thread object after some time of > usage and use a fresh one. This needs to include thread objects staying in > the pool for a long time -- This message was sent by Atlassian JIRA (v6.3.4#6332)