Xalan memoryleak when transformation runs in an own thread
----------------------------------------------------------

         Key: XALANJ-2052
         URL: http://issues.apache.org/jira/browse/XALANJ-2052
     Project: XalanJ2
        Type: Bug
  Components: transformation  
    Versions: 2.6    
 Environment: Reproducable on Windows 2000 and up, Linux 2.6 and Solaris 9 with 
JVM 1.4.1/1.4.2/1.5
    Reporter: Daniel Pfeifer


Dear Sirs,

We are currently using Xalan in a live environment with high performance 
requirements. Ever since we started using Xalan we have been experiencing a 
problem during transformation. After our server has been serving a couple of 
million requests it keeps consuming more and more memory until the virtual 
machines responds with an OutOfMemoryError. We have been profiling the 
application and came to the conclusion that the Xalan is leaking memory when 
TransformerImpl.transform() is executed in its own thread (it's started in an 
own thread so we can wait for the thread to die for like 5 seconds and if the 
thread is not finished yet, we will get back to the thread at some later time 
and check again).

However, the Profiler (there is a Profiler capture available if someone needs 
it) pointed out following classes as consuming huge amounts of
memory:

org.apache.xerces.parser.SAXParser
org.apache.xml.utils.XMLReaderManager
org.apache.xalan.xsltc.dom.SAXImpl

According to the profiler the XMLReaderManager holds a class-variable called 
m_inUse of type Hashtable. This table seems to increase for every new 
transformation. It never ever decreases, and that even though every single 
thread in which transformer.transform(a,b) executes has been finishing normally.

Since we are under pressure to find a solution to this problem I've been 
wondering if one knows a workaround for this problem.

=== TransformerTest.java =====================================

    public String doTransformation(String xml, String xsl) {

          // ... Code to create the TransformerFactory ...

        Templates t = transformerFactory.newTemplates(new
StreamSource(new StringReader(xsl)));

        final Transformer transformer = t.newTransformer();
        StringWriter stringWriter = new StringWriter();
        final TransformerError transformerError = new TransformerError();

        final Source xmlSource = new StreamSource(new StringReader(xml));
        final Result transformerResult = new StreamResult(stringWriter);

        Thread transformerThread = new Thread() {
            public void run() {
                try {
                    transformer.transform(xmlSource, transformerResult);
                } catch (Exception e) {
                    transformerError.setException(e);
                }
            }
        };

        transformerThread.start(); // Start the Transformer thread.

        try {
            transformerThread.join(5000); // Wait for some seconds, hopefully 
thread is done after this.
            if (transformerThread.isAlive()) {
                        // outside the scope of this example
            }
        } catch (InterruptedException e) {
                // outside the scope of this example
        }

        if (transformerError.getException() != null) {
            throw transformerError.getException();
        }

        String xsl = stringWriter.toString();
        return xsl;
    }

    private class TransformerError {
        private Exception exception;

        public Exception getException() {
            return exception;
        }

        public void setException(Exception exception) {
            this.exception = exception;
        }
    }

=== TransformerTest.java ============================ END ====

Additionally I would like to add that I did try to use SAXSource, run entire 
Xalan-related code in the Thread and a couple of other things. It will always 
leak memory unless I don't use a Thread, which I believe is not an option for 
me since it does have a purpose.

Don't hesitate to ask additional questions, any tips are helpful.

Thanks in advance,
Daniel Pfeifer


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to