You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by "PJ Fanning (Jira)" <ji...@apache.org> on 2026/10/04 12:06:00 UTC

[jira] [Closed] (XMLBEANS-676) ThreadLocals in NamespaceContext are sometimes left over and cause a memory leak

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

PJ Fanning closed XMLBEANS-676.
-------------------------------
    Resolution: Fixed

> 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
>             Fix For: 5.5.0
>
>         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: dev-unsubscribe@poi.apache.org
For additional commands, e-mail: dev-help@poi.apache.org