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] [Created] (JEXL-244) Webapp classloader memory leaks
Date Tue, 31 Oct 2017 09:03:01 GMT
Dmitri Blinov created JEXL-244:
----------------------------------

             Summary: 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


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