cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andreas Hartmann <andr...@apache.org>
Subject Re: PermGen memory leak in cocoon-jnet
Date Wed, 30 Nov 2011 13:09:47 GMT
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


Mime
View raw message