[ http://issues.apache.org/jira/browse/XALANJ-2052?page=all ]

Brian Minchau updated XALANJ-2052:
----------------------------------

    Fix Version: 2.7

> 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
>      Fix For: 2.7

>
> 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
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


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

Reply via email to