[
https://issues.apache.org/jira/browse/JEXL-244?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16255010#comment-16255010
]
Dmitri Blinov commented on JEXL-244:
------------------------------------
Although it's not easy to admit ones mistakes :-), but I have a sin of
premature reporing, sorry. I must aknowledge that you are right in your
suggestion and the leak seems to stem from another source. I haven't finished
with the research but I think we can close this issue, either rolling back
changes or keeping it as it is now. Thanks for your efforts BTW, I appreciate
your involvement!
> 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)