tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michal Botka <>
Subject Tomcat classloader memory leak when an object is stored into session
Date Thu, 06 Feb 2014 20:13:11 GMT
When an application stores an object into the session and then the
application is reloaded using Tomcat Web Application Manager, the
classloader cannot be garbage collected. As a result, the
"OutOfMemoryError: PermGen space" error occurs after several reloads.

To illustrate the issue, you can find an example below.
Thanks in advance :-)

1. The EvilClass class whose instances are stored into the session:

public class EvilClass implements Serializable {

    // Eat 100 MB from the JVM heap to see that the class is not
garbage collected
    protected static final byte[] MEM = new byte[100 << 20];

    private String value;

    public String getValue() {
        return value;

    public void setValue(String value) {
        this.value = value;


2. Servlet which stores EvilClass instances into session

public class TestServlet extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse
resp) throws ServletException, IOException {
        EvilClass obj = new EvilClass();
        req.getSession().setAttribute("test", obj);
        getServletContext().log("Attribute stored to session " + obj);


3. web.xml part which maps the servlet to an URL


Steps to reproduce the issue:
1. Copy application WAR to the webapps directory.
2. Start Apache Tomcat.
3. Hit TestServlet.
4. Check Heap/PermGen size using Java VisualVM.
5. Reload the application thru Tomcat Web Application Manager.
6. Hit TestServlet again.
7. Perform GC and check Heap/PermGen size again.

Apache Tomcat version: 7.0.50
OS: Windows 7 64
JVM: Java HotSpot(TM) 64-Bit Server VM (23.6-b04, mixed mode)
Java: version 1.7.0_10, vendor Oracle Corporation

  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message