2013-04-29 10 views
5

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.

+0

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. –

+1

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

Odpowiedz

2

Nigdy nie używaj System.gc(). Uruchamianie zawsze trwa długo i często nic nie robi.

Najlepszą rzeczą do zrobienia jest przepisanie kodu, aby zminimalizować wykorzystanie pamięci w maksymalnym stopniu. Nie wyjaśniłeś dokładnie, jak działa twój kod, ale tutaj są dwa pomysły:

  • Spróbuj ponownie użyć struktur danych, które generujesz dla każdego miesiąca. Powiedzmy, że masz listę faktur, użyj tej listy ponownie na następny miesiąc.
  • Jeśli potrzebujesz tego wszystkiego, rozważ przetwarzanie przetworzonych plików do plików tymczasowych podczas przetwarzania, a następnie załaduj je ponownie, gdy będziesz gotowy.
1

Powinniśmy pamiętać, że System.gc() tak naprawdę nie uruchamia Garbage Collectora. Po prostu prosi o to samo. JVM może lub nie może uruchomić Garbage Collectora. Wszystko, co możemy zrobić, to udostępnić niepotrzebne struktury danych do zbierania śmieci. Możesz zrobić to samo:

  1. Przypisanie Null jako wartości dowolnej struktury danych po jej użyciu. W związku z tym żadne aktywne wątki nie będą miały do ​​niego dostępu (w skrócie umożliwiając gc).
  2. ponowne wykorzystanie tych samych struktur zamiast tworzenia nowych.
Powiązane problemy