程序运行一段时间后tomcat无响应,调整tomcat最大内存为5120M依然溢出,异常如下
Exception in thread "C3P0PooledConnectionPoolManager-Helper Thread-#0" java.lang.OutOfMemoryError: PermGen space
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at com.mchange.v2.c3p0.impl.C3P0ImplUtils.supportsMethod(C3P0ImplUtils.java:309)
at com.mchange.v2.c3p0.impl.NewPooledConnection.<init>(NewPooledConnection.java:104)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:198)
at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:152)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1074)
at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1061)
at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32)
at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1796)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:620)

解决方案 »

  1.   

    你应该用了 tomcat 的 reload 功能吧?
      

  2.   

    我用 C3P0 都几年了,从来没碰到过你所说的这种问题啊。PermGen space OutOfMemoryError 表示持久堆内存溢出,也就是说重复加载的类过多了,导致持久堆空间不足。一般情况下不会出现这种问题,只有在应用服务器热部署次数多了之后才会有这种情况。
      

  3.   

    支持3楼意见。另外,如果确实因为你的类包和静态对象太多导致持久堆溢出,你用 -Xmx 参数加内存是没意义的,要用:
    -XX:MaxPermSize=512m