【问题标题】:tomcat redeploy perm gen spacetomcat部署permgen空间
【发布时间】:2016-10-19 05:20:27
【问题描述】:

我有这些代码用于关闭 c3p0 连接管理器。没有消息显示有线程会导致内存泄漏。但是当我重新部署我的应用程序时,我的 perm gen 内存不断增加。

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]

这是我的 servlet 监听器的代码

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");
}

这是我对 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>

【问题讨论】:

  • 您的池连接存储在堆中,而不是在 PermGen 空间中。您的 PermGen 耗尽不是因​​为连接池泄漏,而是因为您在 tomcat 中重新部署应用程序。
  • 烫发增加正常吗?
  • 我会说您可能希望增加 PermGen 以用于开发目的,因为在开发时,您将执行大量重新部署。但在生产中,不需要巨大的 PermGen。

标签: java tomcat servlets permgen


【解决方案1】:

如果您想追踪泄漏,我建议您查看this blog post of mine

如果您只是想解决这个问题,请将我的ClassLoader Leak Prevention library 添加到您的应用程序中。

我注意到您使用 Oracle JDBC 驱动程序,即known 导致这些类型的泄漏。另外,您是将驱动程序保留在您的应用程序 (WEB-INF/lib) 中还是在 Tomcat 中?

【讨论】:

  • 我的 ojdbc 在 (WEB-INF/lib) 中
  • 那么你应该把它移到你的应用程序之外,或者在你的contextDestroyed()中明确地从DriverManager注销驱动程序
  • '枚举 drivers = DriverManager.getDrivers(); for (; drivers.hasMoreElements();) { Driver driver = drivers.nextElement(); // 我们搜索此 Web 应用程序加载的驱动程序 if (driver.getClass().getClassLoader() == this.getClass().getClassLoader()) { try { DriverManager.deregisterDriver(driver); logger.info("成功关闭驱动"); } catch (SQLException e) { e.printStackTrace(); } } }'
  • 这段代码可以吗? Enumeration&lt;Driver&gt; drivers = DriverManager.getDrivers(); for (; drivers.hasMoreElements();) { Driver driver = drivers.nextElement(); // We search for driver that was loaded by this web application if (driver.getClass().getClassLoader() == this.getClass().getClassLoader()) { try { DriverManager.deregisterDriver(driver); logger.info("Success Closing Driver"); } catch (SQLException e) { e.printStackTrace(); } } }
  • 似乎 perm gen 在重新部署我的应用程序时仍然增加。我已添加您的库并取消注册 JDBC 驱动程序。
猜你喜欢
  • 2016-03-26
  • 2013-08-18
  • 1970-01-01
  • 2012-08-18
  • 2012-04-22
  • 2014-08-23
  • 2012-03-12
  • 2011-12-23
  • 2015-08-30
相关资源
最近更新 更多