2010-03-31 12 views
5

Nasza firma planuje przejść na 64-bitową maszynę JVM, aby uzyskać maksymalnie 2 GB maksymalnego rozmiaru sterty. Google dało mi bardzo mieszane wyniki dotyczące wydajności 64-bitowej maszyny wirtualnej maszyny wirtualnej. ktoś próbował przeprowadzce do 64 bit java i podzielić się swoimi doświadczeniamiDoświadczenie przejścia na 64-bitową maszynę JVM

+0

x64 lub non-x64? W przeważającej części po prostu zwiększa wykorzystanie pamięci, a tym samym przepustowość pamięci. W przypadku architektury x86 AMD stworzył mniej szalony zestaw instrukcji niż x86. –

+1

@Anders, nie każdy ma taką obsesję na punkcie tych liczb jak ty! : P Niektórzy ludzie (czy możesz sobie wyobrazić?) Odpowiedz tylko po to, by pomóc. –

+2

@ Vladimir Dyuzhev: Obsesja nie jest problemem. Tak działa społeczność. Odpowiedz i zaakceptuj, w jaki sposób określić, kto ma historię dobrych odpowiedzi. Brak akceptacji oznacza brak historii dobrych odpowiedzi. Bez historii dobrych odpowiedzi, trudno jest wiedzieć, na ile ufają, by umieścić odpowiedź. –

Odpowiedz

3

Jeśli potrzebujesz większego sterty, pytania dotyczące wydajności są raczej dyskusyjne, czyż nie? A może masz plan skalowania poziomego?

Głównym problemem, który słyszałem w aplikacjach 64-bitowych, jest to, że pełne odśmiecanie może zająć bardzo dużo czasu (ponieważ jest oparte na liczbie obiektów na żywo). Więc chcesz dokładnie dostroić parametry GC, aby uniknąć pełnych kolekcji (słyszałem jedną anegdotę o firmie, która miała 64 Gb sterty i dostosowałem ich GC, tak aby nigdy nie miały pełnego GC, po prostu by się zamknęli w dół raz w tygodniu).

Co więcej, należy pamiętać, że Java ma 32-bitową konstrukcję, więc prawdopodobnie nie zobaczycie dużego wzrostu wydajności dzięki przenoszeniu 64-bitowych danych jednocześnie. Nadal jesteś ograniczony do 32-bitowych indeksów tablicowych.

+0

Mamy maszynę JVM, w której gc działa równolegle, co działa dobrze, ale jeśli gc nie zostanie wykonany, gdy następny gc ma zostać uruchomiony, JVM zatrzymuje się, aż zostanie wykonany drugi gc. Zły! Zdarza się, ponieważ system operacyjny jest bardzo agresywny w wymianie pamięci. –

+0

Czy mógłbyś wyjaśnić, co masz na myśli, mówiąc, że Java jest 32-bitowa według projektu? z tego, co wiem, Java jest niezależna od platformy z projektu nr? – Pacerier

+0

Uwaga o projekcie 32-bitowym według projektu jest nieparzysta. Kiedy omawiamy 32/64/128 bitów, zwykle jest to wielkość wskaźnika, który wpływa na wielkość pamięci roboczej. Fakt, że Java używa ints do tablic ogranicza rozmiar pojedynczej tablicy, ale abstrakcja taka jak bufory nio może być użyta do wydajnego obejścia tego. Ponieważ nie jest to idealne, istnieją plany, aby indeksy mogły być długie. Jednak nie jest to ograniczenie techniczne, takie jak maksymalny stóg 4Gb. –

1

Napisaliśmy bezpośrednio do 64bit i widzę żadnego negatywnego zachowania ...

3

działa dobrze dla nas. Dlaczego po prostu nie spróbujesz go skonfigurować i uruchomić zestawu testów obciążenia pod profilerem takim jak jvisualvm?

9

W skrócie: 64-bitowe JVM pochłonie więcej pamięci dla odniesienia do obiektu i kilku innych rodzajów (zwykle nie istotne) zużywają więcej pamięci na nici (często istotne w miejscach o dużej objętości) i pozwalają mają większe stosy (generalnie tylko ważne, jeśli masz wiele długowieczne obiektów)

Dłuższe odpowiedzi/komentarze:

  • komentarz, że Java jest 32-bitowy przez projektu jest mylące. Java-adresowanie to 32-bitowe lub 64-bitowe, ale specyfikacja VM zapewnia, że ​​ większość pól (np. Int, long, double, itd.) Jest takich samych niezależnie.

  • Również - Tuning GC komentarze podczas adekwatne do liczby obiektów, nie mogą być istotne , GC może być szybki na JVMs z dużych pryzmach (Pracowałam z hałdy aż do 15GB, z bardzo szybka GC) - zależy to od tego, jak grasz z generacyjnymi schematami kolekcjonerskimi i jaki jest twój wzorzec użycia obiektu . O ile w przeszłości ludzie spędzili mnóstwo energii parametrów strojenia, jest bardzo uzależnione obciążenie pracą, a nowoczesny (Java 5+) JVM są bardzo dobre w samodostrajanie - chyba masz dużo danych, jesteś bardziej prawdopodobnie wyrządzi krzywdę, niż pomoże z agresywnym strojeniem JVM.

  • Jak wspomniano na architekturach x86, 64-bitowych procesorów x64 lub EMT64 obejmują również nowe instrukcje robi takie rzeczy jak pisze atomowych lub innych opcji, które mogą również wpływać aplikacji o wysokiej wydajności.

+0

Czy możesz wyjaśnić, co masz na myśli przez "pola (np. Int, long, double, itp.) Są takie same niezależnie"? – Pacerier

1

Naiwna praca z 32-bitowymi obciążeniami JVM i umieszczanie ich na 64-bitowym dysku daje w moim odczuciu wydajność i miejsce.

Jednak większość głównych dostawców JVM wdrożyło teraz dobrą technologię, która zasadniczo kompresuje część sterty - nazywa się to skompresowanymi referencjami lub skompresowanymi oops dla 64-bitowych maszyn JVM, które nie są "duże" (tj. W 4 -30 gb zasięgu).

To robi dużą różnicę i powinno spowodować, że przejście 32-> 64 będzie miało znacznie mniejszy wpływ.

referencyjny dla IBM JVM: link text

+0

Myślę, że to jest -XX: + UseCompressedOops dla Oracle JVM – Karussell

Powiązane problemy