Am 29.11.11 02:55, schrieb Andreas Hartmann:
Hi everyone,

when undeploying a C3 app, I'm experiencing a PermGen memory leak due to
cocoon-jnet. You find more general info on the subject at [1].

This is the reference chain:

class java.net.URL
->
org.apache.cocoon.jnet.URLStreamHandlerFactoryInstaller$ParentableURLStreamHandlerFactory

->
org.apache.cocoon.jnet.URLStreamHandlerFactoryInstaller$ParentableURLStreamHandlerFactory

-> org.apache.catalina.loader.WebappClassLoader


The problem is this line of code in URLStreamHandlerFactoryInstaller;
commenting it out resolves the memory leak:

URL.setURLStreamHandlerFactory(new
ParentableURLStreamHandlerFactory(factory, null));

Here the static reference from java.net.URL to a Cocoon class is set.
Does anyone know if and how the reference can be removed, or if we can
achieve the same behaviour without registering the factory with
java.net.URL?

The following patch avoids the memory leak, but I have the feeling that it has functional drawbacks, otherwise the code would already look like this :)

Does anybody know how I can test if the class still fulfils its purpose? Maybe it's possible to provide a unit test?

TIA!


Index: src/main/java/org/apache/cocoon/jnet/URLStreamHandlerFactoryInstaller.java
===================================================================
--- src/main/java/org/apache/cocoon/jnet/URLStreamHandlerFactoryInstaller.java (revision 1208388) +++ src/main/java/org/apache/cocoon/jnet/URLStreamHandlerFactoryInstaller.java (working copy)
@@ -28,13 +28,8 @@
 public class URLStreamHandlerFactoryInstaller {

public static void setURLStreamHandlerFactory(URLStreamHandlerFactory factory) throws Exception {
-        try {
-            // if we can set the factory, its the first!
- URL.setURLStreamHandlerFactory(new ParentableURLStreamHandlerFactory(factory, null));
-        } catch (Error err) {
- ParentableURLStreamHandlerFactory currentFactory = getCurrentFactory(); - setCurrentFactory(new ParentableURLStreamHandlerFactory(factory, currentFactory));
-        }
+ ParentableURLStreamHandlerFactory currentFactory = getCurrentFactory(); + setCurrentFactory(new ParentableURLStreamHandlerFactory(factory, currentFactory));
     }



-- Andreas


--
Andreas Hartmann, CTO
BeCompany GmbH
http://www.becompany.ch
Tel.: +41 (0) 43 818 57 01

Reply via email to