commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dmitri Blinov (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (JEXL-244) Webapp classloader memory leaks
Date Thu, 16 Nov 2017 09:34:00 GMT

    [ 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)

Mime
View raw message