grails - 使用 Quartz 调试 Groovy/Grails 应用程序中的堆空间问题

标签 grails groovy heap-memory quartz-scheduler

我在 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

有那么多 ExpandoMetaClass 实例是否正常?在 Groovy(和 Grails)应用程序中,或者这可能是我引入的问题?

关于 MongoDB:应用程序使用 GORM 和直接使用 Gmongo 从数据库读取和写入许多小项目。但是,我已经检查了所有连接,它们在一段时间后正确关闭。事件线程的数量大约为40个左右。所以我认为DB层应该不是问题。尽管如此,它仍然占用了堆的很大一部分。对此有什么想法吗?

有什么建议吗?

最佳答案

这实际上可能是 GMongo 驱动程序的问题。有a thread in the gmongo Github具有相似环境的用户会遇到非常相似的问题。

Gmongo 是 grails mongo 插件 ( see this source ) 使用的驱动程序。

如果可以的话,尝试使用 MongoDB 驱动程序本身,而不是 Gmongo 或其依赖的 Grails 插件。

作为解决方法和隔离问题的方法,您可以尝试增加堆大小;如果您当前正在人为地缩小堆大小,那么这尤其是一个好主意。

export GRAILS_OPTS="-Xmx1G -Xms256m -XX:MaxPermSize=256m"
grails run-app

如果内存消耗在某个时刻趋于稳定,您可能会停止出现内存不足错误。如果没有,增加堆大小只会推迟不可避免的事情。跟踪相对于堆大小的崩溃时间对于向 gmongo 开发团队报告非常有帮助。

关于grails - 使用 Quartz 调试 Groovy/Grails 应用程序中的堆空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20092235/

相关文章:

java - Grails:使用数据源插件,无法跨不同数据源连接域类

grails - 导入用于 grails 脚本 _Events.groovy 的类

grails - CamelExchangeException:无法将响应写入...由UnsupportedException引起

java - "gradle appRun"上的 Groovy NullPointerException

java - Java 中的时间戳和 mySql 中的时间戳

具有小堆的 Android 设备

validation - Grails:在域类中为整数指定位数

curl - 为什么这个 curl 命令在 groovy 中执行时会失败?

c++ - C++ 中的析构函数和 delete() 方法

c++ - 如何从 C++ 中的动态分配中恢复内存泄漏?