[
https://issues.apache.org/jira/browse/XMLBEANS-676?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18123097#comment-18123097
]
PJ Fanning edited comment on XMLBEANS-676 at 10/4/26 9:52 AM:
--------------------------------------------------------------
org.apache.xmlbeans.ThreadLocalUtil.clearAllThreadLocals() could be used before
Thread.stop or instead of it.
Calling Thread.stop between the push and pop will mean the pop won't happen.
clearAllThreadLocals gets rid of the thread local state.
org.apache.poi.util.ThreadLocalUtil.clearAllThreadLocals() may also be useful.
was (Author: pj.fanning):
org.apache.xmlbeans.ThreadLocalUtil.clearAllThreadLocals() could be used before
Thread.stop or instead of it.
Calling Thread.stop between the push and pop will mean the pop won't happen.
clearAllThreadLocals gets rid of the thread local state
> ThreadLocals in NamespaceContext are sometimes left over and cause a memory
> leak
> --------------------------------------------------------------------------------
>
> Key: XMLBEANS-676
> URL: https://issues.apache.org/jira/browse/XMLBEANS-676
> Project: XMLBeans
> Issue Type: Bug
> Affects Versions: 5.4.1
> Reporter: Dominik Stadler
> Priority: Major
> Attachments: image-2026-10-04-10-19-21-146.png,
> image-2026-10-04-10-20-36-513.png
>
>
> When running the large regression test-suite for Apache POI, I saw that over
> time, more and more memory is allocated by thread-locals in NamespaceContext
> and is not freed any more.
> The test-application reads millions of documents in multiple threads. It
> re-uses the threads for multiple documents.
> Looking at memory dumps, it seems the thread-local in NamespaceContext keeps
> considerable amounts of memory from being freed in at least two threads.
> It seems sometimes the pushed elements are not pop()ed from the stack
> properly.
> A quick look at the code did not show how this can happen, it seems calls to
> "push()" are always followed by a "pop()" in a try-finally block. So elements
> should always be removed again.
> Also pop()ing the last item should always clear the thread-local, but one of
> the two threads has an empty stack with "current" still holding onto a large
> portion of memory.
> The application is using Thread.stop() in some cases, but this should cause
> the thread to be re-created by the executor and thus thread-locals to be
> freed. The application also triggers all sorts of exceptions, including OOMs
> as part of processing files.
>
> As a result, the regression testing application now runs very slowly as it
> constantly causes OOMs as lots of memory is used by the thread-locals.
>
> Thread holding onto memory in "current" inside the thread-local:
> !image-2026-10-04-10-19-21-146.png!
>
> Thread holding onto memory via a large number of elements remaining in the
> stack:
> !image-2026-10-04-10-20-36-513.png!
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]