[jboss-jira] [JBoss JIRA] (AS7-3733) AWT AppContext / EventQueue ClassLoader Memory Leaks

Philippe Guinot (JIRA) jira-events at lists.jboss.org
Tue Feb 14 10:32:00 EST 2012


    [ https://issues.jboss.org/browse/AS7-3733?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12666404#comment-12666404 ] 

Philippe Guinot commented on AS7-3733:
--------------------------------------

Remy,

Using a listener is not a good solution, I'm afraid. Because at that point the current context class loader is the application class loader.

When the AWT Thread is created it refers so to the application's CL, hence the leak.

So this is a code that must be called outside any application specific code. Maybe not the Web component if you want.. Feel free to re-affect this JIRA to anyone, but it should be reopened as long as the given workaround you suggested does not work.


PS: using Thread.currentThread().setContextClassLoader(...) before creating a thread, does not prevent the child thread keeping a reference to the parent thread's CL. I wish it could, but it would be to easy.. A reference to the class loader is also kept in the inheritedAccessControlerContext.



                
> AWT AppContext / EventQueue ClassLoader Memory Leaks
> ----------------------------------------------------
>
>                 Key: AS7-3733
>                 URL: https://issues.jboss.org/browse/AS7-3733
>             Project: Application Server 7
>          Issue Type: Bug
>          Components: Web
>    Affects Versions: 7.1.0.CR1b
>         Environment: AS 7 running on JDK 1.6.0_30, Windows 7
>            Reporter: Philippe Guinot
>            Assignee: Remy Maucherat
>              Labels: appcontext, as7, awt, classloader, eventqueue, jboss, leak
>
> The use of libraries using awt components creates ClassLoader Memory Leaks. This is because the first call to the sun AppContext class makes a static reference to the current class loader.
> Same thing goes with the creation of the AWT Event Queue, as an example the use of the class java.awt.Color makes a static init call to java.awt.Toolkit which creates an AWT EventQueue despite the headless mode. The EventQueue also keep a reference to the current context with the class loader.
> The current work around I've found is to add a call to:
> {code}java.awt.Toolkit.getDefaultToolkit();{code}
> before the application gets loaded.
> This causes the EventQueue to be created and the AppContext to be initialized. 
> Then, as the AWT static references are final, I get rid of this issue for the rest of the server lifecycle.
> I put this code in org.jboss.as.server.Main, just after line 91. However a proper solution would be to use org.apache.catalina.core.JreMemoryLeakPreventionListener which is present in the JBoss Web jar but not used... (cf. https://community.jboss.org/thread/164760 ) However the Tomcat code deals only with the AppContext, not the EventQueue!

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the jboss-jira mailing list