2013-10-07 11 views
6

Moja aplikacja java utrzymuje wewnętrzną pamięć podręczną, która może dorastać do 10 koncertów. Zasady wygaśnięcia są ustawione na 30 minut lub gdy osiągnięty zostanie próg pamięci (używam lokalnego ehcache). Jest oczywiste, że po 30 minutach cały buforowany obiekt znajdzie się w starym genach i będzie wymagał pełnego gc do ich zebrania. Jak na razie przerwa na zatrzymanie świata może osiągnąć 6 sekund i chciałbym ją zmniejszyć.Jak zoptymalizować gc Java dla długich obiektów życia

Średnia wielkość obiektu to 500 tys., Ale może wzrosnąć do 1 megapiksela, więc mówimy o 10000-20000 buforowanych obiektach (w rzeczywistości tablicach bajtów).

Jaka jest najlepsza strategia optymalizacji GC? Wiem, że mogę się wysadzić, ale jest to rozwiązanie ostateczne.

Dziękujemy!

+0

Napisz własny kod pamięci podręcznej vs używając słabego schematu opartego na referencjach. –

+0

Co masz na myśli? jeśli żyje w sterty, nadal będzie podlegać pełnej GC. – Alex

+0

Zależy dokładnie od tego, co robisz. Możesz ponownie użyć głównej struktury, a nawet ponownie użyć tablic bajtów, a nie tworzyć nowe. –

Odpowiedz

2

Rutynowo pracuję z usługami buforowania, mającymi 10-30 GiB danych w stercie JVM. Algorytm Concorde Mark Sweep (GC) radzi sobie z tymi przypadkami całkiem dobrze, zachowując maksymalną przerwę Stop-the-World około 100ms (choć bezwzględne liczby zależą od sprzętu).

Możesz znaleźć GC tuning check list dla buforowania aplikacji i wielkości sterty w moim blogu.

Here można znaleźć więcej informacji o algorytmie Concorde Mark Sweep.

3

Pamięć podręczna 10 GB nie jest czymś, co należy zrobić w stercie. Użyj do buforowania wartości ByteBuffers. Tworzenie obiektu nie powinno być tak kosztowne. W ten sposób nie ma GC i możesz zarządzać wszystkim samemu.

Na przykład, jeśli zaimplementujesz pamięć podręczną strony w systemie Java Database Management System, nie utworzysz dla niego obiektów, ale użyjesz buforów bajtowych lub zarządzanych buforów bajtowych lub najlepszych bezpośrednich buforów bajtów. Możesz dowiedzieć się więcej o tych trzech here.

Jeśli poradzisz sobie więcej, niż powiedz milion obiektów jednocześnie, zobaczysz, że udział czasu GC rośnie. Widziałem sytuacje, w których udało nam się zgromadzić ogromną liczbę węzłów do przetwarzania danych i było to bardzo powolne. Następnie przełączyliśmy się na schemat bufora bezpośredniego na bajt i wykorzystaliśmy nawet kilka dodatkowych technik, w których mogliśmy zmieścić więcej danych (obiekty kosztują co najmniej 24 bajty) i przestaliśmy myśleć o obiektach na pierwszym miejscu. W końcu obsłużyliśmy dane, a nie obiekty. To wielokrotnie zwiększało wydajność i byliśmy w stanie obsłużyć znacznie więcej danych niż się spodziewaliśmy.

Po tym zauważyliśmy, że wszystko pasuje do bazy danych i dobrze, że to był punkt, w którym wszystko zeskrobaliśmy.

Sprawdź więc, co mogą zrobić dla ciebie bezpośrednie bufory.