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