【发布时间】:2010-11-15 01:10:14
【问题描述】:
我正在我的 Grails 应用程序上运行一个长批次。该服务联系 Web 服务并下载本地存储在 grails 应用程序(在数据库中)中的 xml。 下载的对象非常大且复杂,应用程序会处理它们并创建本地域对象。 我正在使用 Grails 1.2.2,因为我无法将我的应用程序升级到最新版本(我花了几个小时在它上面,然后我扔了海绵)。
这基本上是一个很长的 for 循环,迭代之间几乎没有共享信息。
有点像:
while( stillObjectsToDo ){
def bigObj = myservice.fetchXML
def localInstance = myservice.processObj( bigObj )
localInstance.saveEverythingToDB
clearGORM
}
我在 Tomcat 上运行该应用程序,该应用程序已针对增加堆大小进行了调整。 当我处理一个对象时,我从来没有遇到过问题。但是当我运行整个批次(大约 1500 个大对象)时,我总是得到:
codehaus.groovy.grails.web.servlet.mvc.exceptions.ControllerExecutionException: Executing action [runSampleBatch] of controller [semanticopenstreetmap.EngineController] caused exception: java.lang.OutOfMemoryError: Java heap space
at java.lang.Thread.run(Thread.java:619)
Caused by: org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.OutOfMemoryError: Java heap space
... 1 more
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
这似乎是某种内存泄漏,但我找不到它。这真的很奇怪,因为对象存储在数据库中并且不再在过程中使用,所以它们应该被刷新。
我尝试了以下解决方案来避免这个问题,但没有成功:
- 在每次迭代中刷新每个对象后清除 休眠会话
- 每 5-6 分钟调用一次垃圾收集器。
- 在循环结束时手动取消之前的对象(可能没用)。
这些都没有奏效。内存使用量不断增长。 我使用了虚拟虚拟机,得到了这张图: http://img12.imageshack.us/img12/5660/memoryleak.png 和课程: http://img263.imageshack.us/img263/331/memoryleakclasses.png
如何定位并解决此内存泄漏?
编辑:在单独的线程中运行每个对象是否有意义?内存泄漏发生在 http-0-x 进程中,如何检查这个对象?
有什么提示吗?
谢谢!
穆龙
【问题讨论】:
-
你用的是什么抓取收集器?
-
我使用的是默认的:Runtime.getRuntime().totalMemory() 和 Runtime.getRuntime().freeMemory()
标签: hibernate tomcat grails memory-management memory-leaks