Mam bazę danych, w której przechowuję faktury. Muszę wykonywać skomplikowane operacje dla dowolnego miesiąca z serią algorytmów wykorzystujących informacje ze wszystkich faktur. Pobieranie i przetwarzanie niezbędnych danych dla tych operacji zajmuje dużą ilość pamięci, ponieważ może istnieć wiele faktur. Problem staje się coraz gorszy, gdy interwał żądany przez użytkownika do tych obliczeń wzrasta do kilku lat. W rezultacie otrzymuję wyjątek PermGen, ponieważ wydaje się, że odśmiecacz nie wykonuje swojej pracy między obliczeniami każdego miesiąca.Czy jest jakiś sposób na zwolnienie pamięci podczas przetwarzania dużej ilości danych?
Zawsze korzystałem z System.GC, aby wskazać GC, aby wykonać swoją pracę, nie jest dobrą praktyką. Moje pytanie brzmi: czy istnieją inne sposoby na uwolnienie pamięci poza tym? Czy możesz zmusić JVM do korzystania z HD swap, aby tymczasowo przechowywać częściowe obliczenia?
Próbowałem również użyć System.gc na koniec każdego miesiąca obliczenia i wynik był wysoki użycie procesora (ze względu na wywołanie garbage) i rozsądnie niższe wykorzystanie pamięci. To może zrobić zadanie, ale nie sądzę, że byłoby to właściwe rozwiązanie.
Jeśli pokażesz nam fragment kodu, możemy zapewnić lepsze wskazówki. Być może twoje zmienne są w złym zasięgu, a tym samym żyją zbyt długo. –
W zależności od rodzaju operacji wykonywanych na danych, może być szybsze korzystanie z bazy danych bezpośrednio do wykonywania tych operacji zamiast ładowania danych do java, tworzenia obiektów i przydzielania pamięci ... Chociaż to nie odpowiada na twoje pytanie, ale jeśli twoje operacje to przeważnie * przesuwanie * liczb dookoła, * robienie pewnych obliczeń *, * czytanie * i * pisanie * ponownie. Cóż, twoja baza danych może wykonywać te operacje szybciej, ponieważ jest "* bliżej źródła *" – GameDroids