Я запускаю длинную партию в своем приложении Grails. Служба связывается с веб-службой и загружает XML, который хранится локально в приложении Grails (в БД).
Загруженные объекты довольно большие и сложные, и приложение обрабатывает их и создает объекты локального домена.
Я использую Grails 1.2.2 , потому что я не мог обновить свое приложение до самой последней версии (я потратил на это несколько часов, а затем добавил губку).
Это в основном длинный цикл с небольшим количеством общей информации между итерациями.
Это что-то вроде:
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 минут.
- обнулить предыдущий объект вручную в конце цикла (вероятно, бесполезно).
Ничего из этого не работало эффективно. Использование памяти продолжает расти.
Я использовал Virtual VM, и я получил этот график:
http://img12.imageshack.us/img12/5660/memoryleak.png
И классы:
http://img263.imageshack.us/img263/331/memoryleakclasses.png
Как я могу найти и устранить эту утечку памяти?
EDIT: имеет ли смысл запускать каждый объект в отдельном потоке ? Утечка памяти происходит в процессе http-0-x, как я могу проверить этот объект?
Есть подсказки?
Спасибо!
Mulone