xml-xalan-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Pfeifer" <Daniel.Pfei...@tradedoubler.com>
Subject Xalan memoryleak when transformation runs in an own thread
Date Tue, 01 Feb 2005 22:34:33 GMT
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

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-dev-help@xml.apache.org


Mime
View raw message