[ https://issues.apache.org/jira/browse/JEXL-244?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Henri Biestro updated JEXL-244: ------------------------------- Assignee: Henri Biestro > 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 > > 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)