Uploaded image for project: 'XalanJ2'
  1. XalanJ2
  2. XALANJ-2195

Memory leak in XMLReaderManager

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Blocker
    • Resolution: Unresolved
    • 2.7
    • None
    • Xalan
    • None

    Description

      In class org.apache.xml.utils.XMLReaderManager

      getXMLReader() method creates a new XMLReader (i.e. SAXParser) and stores it into ThreadLocal.

      releaseXMLReader() does not remove (set to null) ThreadLocal thus creating a permanent leak.

      Unfortunately the size of the cached Reader is typically dependent upon the size of the XML document you process (depends on implementation but this is the case with xerces SAXParser). In heavy load server environments with thread pools of tens and hundreds of threads the server sustains a significant memory leak (hundreds of megabytes - depending on the XML document sizes and number of threads in a thread pools).

      A fix is trivial:

      Put the following line at the end of releaseXMLReader method:

      m_readers.set(null);

      I wonder, why is reader stored in ThreadLocal in the first place?

      Attachments

        1. gc-roots.jpg
          34 kB
          Eric Burke
        2. retained-object-sizes.jpg
          54 kB
          Eric Burke
        3. xalan-j2-2.6.0-xmlmemoryleak-tm2l.patch
          0.8 kB
          Michel Loiseleur

        Activity

          People

            Unassigned Unassigned
            mstruk Marko Strukelj
            Votes:
            12 Vote for this issue
            Watchers:
            9 Start watching this issue

            Dates

              Created:
              Updated: