https://bz.apache.org/bugzilla/show_bug.cgi?id=58296

            Bug ID: 58296
           Summary: Possible memory leak in JspRuntimeContext
           Product: Tomcat 8
           Version: 8.0.26
          Hardware: PC
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Jasper
          Assignee: dev@tomcat.apache.org
          Reporter: christoph.e...@mgm-tp.com

Limitation of maxLoadedJsps and usage of tag files may result in a memory leak
in JspRuntimeContext.

Steps to reproduce the leak:

1) Set Tomcat in its web.xml to production mode and limit the max jsp count to
2

    <init-param>
        <param-name>maxLoadedJsps</param-name>
        <param-value>2</param-value>
    </init-param>
    <init-param>
        <param-name>development</param-name>
        <param-value>false</param-value>
    </init-param>

2) deploy the attach WAR-file "tomcat-test.war". The WAR contains one
HttpServlet, three jsps and one tag file. GET-Requests to
http://localhost:8080/tomcat-test/test render the jsps in the sequence "1.jsp"
-> "2.jsp" -> "3.jsp". 
JSPs 1.jsp and 3.jsp use the tag "test.tag", 2.jsp contains only html.

3) make at least 5 GET-Requests to http://localhost:8080/tomcat-test/test

4) take a heap dump

5) open the dump with Eclipse MAT

6) execute the OOQL-Query 
select * from org.apache.jasper.util.FastRemovalDequeue$Entry e where
e.valid=false

7) "Path To GC Roots" (right click on one result) shows that the invalid
entries are in the retained heap of the tag's JspServletWrapper and hence in
the retained heap of JspRuntimeContext.

The retained heap of JspRuntimeContext grows with every unloaded Jsp (its Entry
in the jspQueue).

The bug is reproducible with Tomcat 7.0.52 and 8.0.26.


Supposed causes:

1) FastRemovalDequeue: removed Entry-instances are flagged as invalid. The
"previous"-field of removed elements isn't set to null. So removed elements
still reference their "previous" element (which still may be in the jspQueue of
JspRuntimeContext)

2) JspServletWrappers of currently loaded jsps and tag files are stored in the
ConcurrentHashMap "jsps" in JspRuntimeContext. JspServletWrappers of Tag files
hold (indirectly over JspCompilationContext -> JasperTagInfo ->
ImplicitTagLibraryInfo -> ParserController) references to JspServletWrapper
instances with already removed "unloadHandles" (FastRemovalDequeue$Entry
instances with valid == false). 

2) leads in combination with 1) to a reproducible memory leak: the chain of
"previous" linked entries contains all JspServletWrappers of unloaded and
currently loaded jsps. In combination with maxLoadedJsps != -1, the chain can
grow till an OutOfMemoryError occurs.

-- 
You are receiving this mail because:
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to