[ https://issues.apache.org/jira/browse/JEXL-244?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Henri Biestro resolved JEXL-244. -------------------------------- Resolution: Fixed Fix Version/s: 3.2 I'm respectfully skeptical that the leak you are reporting originates from a static inner class definition. I've been unable to find another occurence of such a problem (stack overflow, Google...). Nevertheless, long standing working relationship grants benefits. :-) Please report if this fixes things on your end. Committed revision 1814413. trunk/RELEASE-NOTES.txt trunk/src/main/java/org/apache/commons/jexl3/JexlEngine.java trunk/src/site/xdoc/changes.xml > Webapp classloader memory leaks > ------------------------------- > > Key: JEXL-244 > URL: https://issues.apache.org/jira/browse/JEXL-244 > Project: Commons JEXL > Issue Type: Bug > Affects Versions: 3.1 > Environment: Inside J2EE container when Jexl library is included in > the deployed .war file > Reporter: Dmitri Blinov > Assignee: Henri Biestro > Fix For: 3.2 > > > I have spotted that the following constructions, like for example in > JexlEngine.java > {code} > public static final Object TRY_FAILED = new Object() { > @Override > public String toString() { > return "tryExecute failed"; > } > }; > {code} > are not garbage collected when web-app is reloaded and its classloader is > released. This is because circular references are created when static class > members are initialized with non-static inner/anonymous classes, which are > holding implicit references to its enclosing class and thus to its static > class type. There are other such examples in JexlEngine.java like > {code} > protected static final java.lang.ThreadLocal<JexlContext.ThreadLocal> > CONTEXT = new java.lang.ThreadLocal<JexlContext.ThreadLocal>() {.. > protected static final java.lang.ThreadLocal<JexlEngine> ENGINE = > new java.lang.ThreadLocal<JexlEngine>() {... > {code} > The issue is easily resolved if for example the following pattern is followed > {code} > public static class FailObject extends Object { > @Override > public String toString() { > return "tryExecute failed"; > } > } > public static final Object TRY_FAILED = new FailObject(); > {code} -- This message was sent by Atlassian JIRA (v6.4.14#64029)