Search code examples
javatomcatservletspermgen

tomcat redeploy perm gen space


I have these codes for closing c3p0 connection manager. no message shows that there is a thread that will cause memory leak. But as i redeploy my application my perm gen memory keeps on increasing.

Oct 19, 2016 11:05:48 AM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing WebApplicationContext for namespace 'dispatcherServlet-servlet': startup date [Wed Oct 19 10:41:03 PHT 2016]; parent: Root WebApplicationContext
2016-10-19 11:05:48 - [INFO ] CRMContextListener - Trying to Close
2016-10-19 11:05:53 - [INFO ] CRMContextListener - Close Success
Oct 19, 2016 11:05:53 AM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing Root WebApplicationContext: startup date [Wed Oct 19 10:40:53 PHT 2016]; root of context hierarchy
Oct 19, 2016 11:05:53 AM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Oct 19, 2016 11:06:03 AM org.apache.catalina.core.StandardContext stop
INFO: Container org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/crmdev] has not been started
Oct 19, 2016 11:06:04 AM org.apache.catalina.startup.HostConfig checkResources
INFO: Undeploying context [/crmdev]

This is the code for my servlet listener

public void contextDestroyed(ServletContextEvent sce) {
    logger.info("Trying to Close");

    for (Object o : C3P0Registry.getPooledDataSources()) {
        try {
            ((PooledDataSource) o).close();
        } catch (Exception e) {
            logger.info("No thread was open...");
        }
    }

    logger.info("Close Success");
}

And here is my configuration for c3p0

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
    <property name="jdbcUrl" value="jdbc:oracle:thin:@sph-pdc-vm  1042:1521:DEV" />
    <property name="user" value="TSW" />
    <property name="password" value="TSW2015#" />
    <property name="minPoolSize" value="2" />
    <property name="maxPoolSize" value="20" />
    <property name="initialPoolSize" value="5" />
    <property name="testConnectionOnCheckin" value="true" />
    <property name="idleConnectionTestPeriod" value="100" />
    <property name="maxIdleTimeExcessConnections" value="5" />
    <property name="maxStatementsPerConnection" value="10" />
    <property name="acquireIncrement" value="1" />
    <property name="statementCacheNumDeferredCloseThreads" value="1" />
    <property name="acquireRetryAttempts" value="2" />
    <property name="acquireRetryDelay" value="2000" />
</bean>

Solution

  • If you want to track down the leak I recommend you to have a look at this blog post of mine.

    If you just want to get rid of the problem, add my ClassLoader Leak Prevention library to your application.

    I notice that you use Oracle JDBC driver, which is known to cause these kinds of leaks. Also, do you keep the driver inside your app (WEB-INF/lib) or in Tomcat?