我在我的Grails應用程序上運行了一個很長的批處理。該服務聯繫Web服務並下載本地存儲在grails應用程序(在數據庫中)的xml。 下載的對象非常龐大複雜,應用程序會處理它們並創建本地域對象。 我正在使用Grails 1.2.2,因爲我無法將我的應用程序升級到最新版本(我花了幾個小時,然後扔進了海綿)。在Grails/Tomcat上長時間批量處理OutOfMemoryError
它基本上是一個很長的循環,迭代之間很少有共享信息。
這就像一句:
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)
似乎某種內存泄漏,但我不能找到它。這很奇怪,因爲對象存儲在數據庫中,並且在過程中不再使用,所以應該刷新它們。
我嘗試了以下解決方案,以避免與沒有運氣的問題:在每次迭代
- 清除Hibernate會話。
- 在循環結束時手動取消先前的對象(可能無用)。
這一切都沒有奏效。內存使用量不斷增加。 我用虛擬VM和我得到這個圖: http://img12.imageshack.us/img12/5660/memoryleak.png 及其類別: http://img263.imageshack.us/img263/331/memoryleakclasses.png
我怎樣才能找到並解決此內存泄漏?
編輯:運行單獨的線程中的每個對象是否有意義?內存泄漏發生在http-0-x進程中,我如何檢查這個對象?
任何提示?
謝謝!
Mulone
您使用的是什麼收集器? – 2010-11-15 09:12:46
我使用默認的:Runtime.getRuntime()。totalMemory()和 Runtime.getRuntime()。freeMemory() – Mulone 2010-11-15 11:12:17