Управление памятью на Glassfish
У меня есть несколько фоновых задач на моем сервере Glassfish, реализованных@TimerService
экземпляров. Целью этих служб является извлечение данных из файлов и вставка этих данных в базу данных.
Первоначально я пытался сделать это в JPA, но система зашла в тупик, я теперь преобразовал процесс в JDBC, который намного более отзывчив. Однако где-то на этом пути все еще есть огромные утечки памяти, которые я не могу точно определить.
Каждый файл извлекается методом, который управляет своими собственными транзакциями (1 файл = 1 транзакция). Я бы подумал, что, как только этот метод завершит работу, все переменные потеряют область видимости и станут GC-ed, но это не так. Через очень короткое время я испытываюOutOfMemoryException
.
Мне интересно, если, как и почему Glassfish будет хранить ссылки на мои переменные (которые являются очень тяжелыми объектами). Какие настройки или методологии я могу применить, чтобы минимизировать эти утечки памяти?
Для справки я использую стандартные настройки Glassfish с парой модификаций:
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=256m
–XmX1024m