经常出现内存问题

时间:2013-08-20 06:15:04

标签: out-of-memory c3p0

我们正在运行分配了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 个答案:

答案 0 :(得分:0)

我的建议是使用内存分析器来检查内存不足时堆的内容,而不是猜测。这将为您提供关于什么记录所有内容的明确答案,并让您在下一步采取哪些步骤时做出明智的选择。

答案 1 :(得分:0)

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

你需要进行记忆分析,看看是否占据了permgen空间。

作为临时措施,您可以使用-XX:PermSize -XX:MaxPermSize

增加permgen空间

如果您使用的是弹簧,则此错误的常见原因之一是cglib库的使用不当。

答案 2 :(得分:0)

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

使用

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

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

答案 3 :(得分:0)

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

在c3p0-0.9.5-pre4及更高版本中,将配置参数privilegeSpawnedThreads设置为true而将contextClassLoaderSource设置为library可以解决此问题。我希望在接下来的几天内发布c3p0-0.9.5-pre4。