Ostatnio pracuję nad programem do Javy. Początkowo zawsze podobało mi się zarządzanie pamięcią w Javie, nie musisz się martwić o alokację pamięci, wystarczy alokować, garbage collector odzyska pamięć za ciebie. Program jest teraz opracowany z dużą ilością danych, a dla szybkości zamierzam załadować wszystkie informacje do pamięci, co zapewni szybką odpowiedź. Wciąż wielokrotnie liczę pamięć, myśląc o własnej ilości danych, co powinno wystarczyć na początku (mój komputer ma pamięć 4G, chociaż Windows rozpoznaje 3,5G, ale powinno być dobrze w porównaniu do obecnej ilości danych).
Niespodziewanie program pierwszego eksperymentu trwał kilka godzin i napotkał Wyjątek Out of Memory. Patrząc na ustawienia mojej maszyny wirtualnej, ustawiłem -Xms512M -Xmx1024M. Bez zastanowienia od razu zmieniłem to na -Xms512M -Xmx2048M, a w efekcie nie mogłem zarezerwować wystarczająco dużo miejsca na ster obiektów. Program nie może wstać. Dopiero wtedy zorientowałem się, że wciąż istnieje limit oryginalnej maksymalnej pamięci. Przeszukałem Internet i znalazłem wiele artykułów poruszających ten temat. Na koniec znalazłem najbardziej przydatny artykuł na forum DEV2DEV BEA
Tutaj moderator YuLimin przeprowadził test i doszedł do wniosku:
Wersja firmowa JVM Klient z maksymalną liczbą pamięci (mega) Serwer z maksymalną liczbą pamięci (mega)
NIEDZIELA 1.5.x 1492 1520
SUN 1.5.5(Linux) 2634 2660
NIEDZIELA 1.4.2 1564 1564
SUN 1.4.2(Linux) 1900 1260
IBM 1.4.2(Linux) 2047 N/A
BEA JRockit 1.5 (U3) 1909 1902
Używam teraz JDK1.6.0_05, testowałem. Największym problemem w stanie klienta jest to, że mój JDK nie rozpoznaje parametru -Server i nie może przetestować stanu serwera. Szacunki są mniej więcej takie same.
NIEDZIELA 1.6.0 1442 N/a
Wydaje się, że w Javie niemożliwe jest użycie dużej pamięci. A ogólne powiedzenie głosi, że jeśli pamięć jest zbyt duża, czas zbierania śmieci będzie długi. To również zrozumiałe, zazwyczaj zbierane wtedy, gdy pamięć jest za mała, skanowanie pamięci 2G jest oczywiście znacznie wolniejsze niż 1G, a obiektów pamięci jest więcej, a szacowana zależność rośnie wykładniczo.
Poniżej załączono metody testowe i rekordy testowe YuLimin.
Metoda testowa: Użyj polecenia java -XmxXXXXM -version -version, aby przetestować w wierszu poleceń, a następnie stopniowo zwiększać wartość XXXX; jeśli działa normalnie, oznacza to, że dostępny jest określony rozmiar pamięci, w przeciwnym razie zostanie wydrukowany komunikat o błędzie. |