内存泄漏的异常

内存泄漏的异常

问题描述:

谁能帮助我与此异常:内存泄漏的异常

Jul 23, 2012 11:00:57 AM org.apache.catalina.loader.WebappClassLoader loadClass 
INFO: Illegal access: this web application instance has been stopped already. Could not load com.mchange.v2.sql.SqlUtils. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. 
java.lang.IllegalStateException 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1597) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:531) 
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) 
    at org.hibernate.connection.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:78) 
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) 
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) 
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142) 
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85) 
    at net.customware.gwt.dispatch.server.AbstractDispatch.doExecute(AbstractDispatch.java:81) 
    at net.customware.gwt.dispatch.server.AbstractDispatch.execute(AbstractDispatch.java:68) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:216) 
    at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:141) 
    at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:93) 
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:63) 
    at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:122) 
    at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:110) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

而且也为它提供了可能的解决方案..?

在此先感谢...

的基本问题是tomcat的每个Web应用程序创建一个新的类加载器,当你重新设置程序禁用的classloader,例如通过热部署新版本。 c3p0创建助手线程。如果c3p0已加载到Web应用程序的类加载器中,然后该应用程序被重置,则c3p0的线程可能仍处于活动状态并持有对从现已不存在的ClassLoader加载的对象的引用,导致出现新类时必须显示的错误类型加载。

多线程组件与tomcat的“热”ClassLoading方案之间的交互可能具有挑战性。一些建议:

1)如果您的Web应用程序构造自己的c3p0 DataSource(例如在ContextListener中),请确保在应用程序关闭时(在同一个ContextListener中)DataSource也是close()的

2)尝试让c3p0和您的JDBC驱动程序类加载到除web-app特定的ClassLoader之外的其他类中。将c3p0 jar文件,change-commons-java jar文件以及您的JDBC驱动程序jar文件放在common,system或bootstrap ClassLoader可以找到的地方。确保将这些文件从Web应用程序的lib目录中取出,因为首先尝试了Web应用程序ClassLoader。有关更多信息,请参阅http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html

我希望这有助于!