1

我们正在运行分配了 6GB 堆的 Web 应用程序。但是,一段时间后,它会耗尽内存。

下面给出了异常堆栈跟踪。

Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2" java.lang.OutOfMemoryError: PermGen space
00:46:52,678  WARN ThreadPoolAsynchronousRunner:608 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@772df14c -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
00:46:52,682  WARN ThreadPoolAsynchronousRunner:624 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@772df14c -- APPARENT DEADLOCK!!! Complete Status:
        Managed Threads: 3
        Active Threads: 0
        Active Tasks:
        Pending Tasks:
                com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@3e3e8a19
Pool thread stack traces:
        Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,]
        Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,]
        Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,]


Exception in thread "Task-Thread-for-com.mchange.v2.async.ThreadPerTaskAsynchronousRunner@6bbc0209" java.lang.OutOfMemoryError: PermGen space
Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1" java.lang.OutOfMemoryError: PermGen space
Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0" java.lang.OutOfMemoryError: PermGen space
Exception in thread "com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2" java.lang.OutOfMemoryError: PermGen space

这是 C3p0 连接池的问题吗?

4

4 回答 4

0

我的建议是在内存不足时使用内存分析器检查堆的内容,而不是猜测。这会给你一个明确的答案,让你知道是什么占用了所有的记忆,并让你就下一步要采取的步骤做出明智的选择。

于 2013-08-20T06:17:06.127 回答
0

你快没permgen记忆了。这比正常的内存不足更难解决。它与 C3p0 的使用无关。

您需要进行内存分析并查看占用 permgen 空间的内容。

作为临时措施,您可以通过使用来增加 permgen 空间-XX:PermSize -XX:MaxPermSize

如果您使用的是 spring,那么导致此错误的常见原因之一是cglib库使用不当。

于 2013-08-20T06:19:56.003 回答
0

根据最后几条消息,您可能会用完 PermGen 内存。根据您的帖子,6 GB 分配给堆。如果您有足够的物理内存,请将分配给 PermGen 的内存加倍。如果问题仍然存在(并且在或多或少相同的时间后发生),请恢复更改并考虑通过适当的方法分析堆。

采用

-XX:PermSize=1024m -XX:MaxPermSize=1024m

对于 1 GB (1024 MB) 分配。你可能需要更多。

于 2013-08-20T06:20:47.383 回答
0

c3p0 和 Tomcat 在热重新部署下类(卸载)加载的一些不寻常且困难的实现可能会导致 permgen 内存问题。下一个 c3p0 预发行版对此问题进行了一些修复;它们已经实现了,但现在你必须通过 github 从源代码构建,这并不容易。

在 c3p0-0.9.5-pre4 及更高版本中,将 config param 设置privilegeSpawnedThreadstruecontextClassLoaderSourcetolibrary应该可以解决问题。我希望在接下来的几天内发布 c3p0-0.9.5-pre4。

于 2013-08-21T05:05:15.150 回答