Zarządzanie pamięcią na Glassfish
Mam kilka zadań w tle uruchomionych na moim serwerze Glassfish zaimplementowanym przez@TimerService
instancje. Celem tych usług jest wyodrębnienie danych z plików i wstawienie tych danych do bazy danych.
Początkowo próbowałem to zrobić w JPA, ale system utknął daleko w tyle, że teraz przekonwertowałem proces na JDBC, który jest znacznie bardziej responsywny. Jednak wciąż gdzieś po drodze są ogromne wycieki pamięci, których nie mogę wskazać.
Każdy plik jest wyodrębniany w metodzie, która zarządza własnymi transakcjami (1 plik = 1 transakcja). Sądzę, że gdy ta metoda sfinalizuje wszystkie zmienne, stracą swój zasięg i staną się GC'ed, ale tak nie jest. Po bardzo krótkim czasie doświadczamOutOfMemoryException
.
Zastanawiam się, czy i jak i dlaczego Glassfish będzie odnosił się do moich zmiennych (które są bardzo ciężkimi obiektami). Jakie ustawienia lub metodologie mogę zastosować, aby zminimalizować te wycieki pamięci?
Dla porównania używam zapasowych ustawień Glassfish z kilkoma modyfikacjami:
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled
-XX:MaxPermSize=256m
–XmX1024m