我们正在运行分配了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连接池的问题吗?
答案 0 :(得分:0)
我的建议是使用内存分析器来检查内存不足时堆的内容,而不是猜测。这将为您提供关于什么记录所有内容的明确答案,并让您在下一步采取哪些步骤时做出明智的选择。
答案 1 :(得分:0)
你的permgen
内存不足。这比正常的内存不足更难解决。它与C3p0的使用无关。
你需要进行记忆分析,看看是否占据了permgen空间。
作为临时措施,您可以使用-XX:PermSize -XX:MaxPermSize
如果您使用的是弹簧,则此错误的常见原因之一是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。