【发布时间】:2013-12-04 05:26:46
【问题描述】:
我在 Groovy/Grails 中创建了一个小应用程序,它使用 Quartz 每 10 秒执行一个小作业。现在我遇到的问题是,运行几个小时后,应用程序崩溃并显示org.quartz.JobExecutionException: java.lang.OutOfMemoryError: Java heap space [See nested exception: java.lang.OutOfMemoryError: Java heap space]。
现在我正在尝试使用Eclipse Memory Analyzer 查找导致该问题的原因。通过查找“问题嫌疑人”,分析器显示以下结果:
Problem Suspect 1
3,926 instances of "groovy.lang.ExpandoMetaClass",
loaded by "org.codehaus.groovy.grails.cli.support.GrailsRootLoader @ 0x122e88b98"
occupy 95,746,168 (33.69%) bytes.
Keywords
org.codehaus.groovy.grails.cli.support.GrailsRootLoader @ 0x122e88b98
groovy.lang.ExpandoMetaClass
--
Problem Suspect 2
1,010 instances of "com.mongodb.DBApiLayer",
loaded by "org.codehaus.groovy.grails.cli.support.GrailsRootLoader @ 0x122e88b98"
occupy 56,522,416 (19.89%) bytes.
These instances are referenced from one instance of
"org.codehaus.groovy.util.AbstractConcurrentMapBase$Segment[]", loaded by
"org.codehaus.groovy.grails.cli.support.GrailsRootLoader @ 0x122e88b98"
Keywords
org.codehaus.groovy.grails.cli.support.GrailsRootLoader @ 0x122e88b98
org.codehaus.groovy.util.AbstractConcurrentMapBase$Segment[]
com.mongodb.DBApiLayer
在 Groovy(和 Grails)应用程序中有这么多 ExpandoMetaClass 实例是否正常,或者这可能是我引入的问题?
关于 MongoDB:应用程序使用 GORM和直接使用 Gmongo 从数据库中读取和写入许多小项目。但是,我已经检查了所有连接,并且它们会在一段时间后正确关闭。活动线程的大致数量约为 40。所以我认为 DB 层应该不是问题。尽管如此,它仍然占据了堆的很大一部分。有什么想法吗?
有什么建议吗?
【问题讨论】:
标签: grails groovy heap-memory quartz-scheduler