Maksymalna pamięć Java w Windows XP

Zawsze byłem w stanie przeznaczyć 1400 megabajtów dla Java SE działającego na 32-bitowym Windows XP(Java 1.4, 1.5 i 1.6).

java -Xmx1400m ...

Dzisiaj próbowałem tej samej opcji na nowym komputerze z systemem Windows XP używając Javy 1.5_16 i 1.6.0_07 i dostałem błąd:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Metodą prób i błędów wydaje się, że 1200 megabajtów to najwięcej, co mogę przeznaczyć na tej maszynie.

Jakieś pomysły, dlaczego jedna maszyna pozwoliłaby na 1400, a inna tylko 1200?

Edit: maszyna ma 4GB PAMIĘCI RAM z około 3,5 GB że okna rozpoznają.

Author: Steve Kuo, 2008-10-05

12 answers

Należy pamiętać, że Windows ma zarządzanie pamięcią wirtualną, a JVM potrzebuje tylko pamięci, która jest sąsiadująca w swojej przestrzeni adresowej . Tak więc inne programy działające w systemie niekoniecznie powinny mieć wpływ na rozmiar sterty. To, co stanie Ci na drodze, to biblioteki DLL, które zostaną załadowane do przestrzeni adresowej. Niestety optymalizacje w systemie Windows, które minimalizują przenoszenie DLL podczas łączenia sprawiają, że bardziej prawdopodobne jest, że będziesz miał fragmentaryczną przestrzeń adresową. Rzeczy, które mogą przeciąć się na Twoja przestrzeń adresowa oprócz zwykłych rzeczy obejmuje oprogramowanie zabezpieczające, oprogramowanie CBT, oprogramowanie szpiegujące i inne formy złośliwego oprogramowania. Prawdopodobnymi przyczynami wariancji są różne łatki bezpieczeństwa, wersje uruchomieniowe C itp. Sterowniki urządzeń i inne bity jądra mają własną przestrzeń adresową (Pozostałe 2GB z 4GB 32-bitowej przestrzeni).

Możesz spróbować przejrzeć powiązania DLL w procesie JVM i spojrzeć na próbę rebase DLL jest w bardziej kompaktowej przestrzeni adresowej. Nie zabawa, ale jeśli jesteś zdesperowany...

Alternatywnie możesz po prostu przełączyć się na 64-bitowy Windows i 64-bitowy JVM. Pomimo tego, co sugerowali inni, podczas gdy będzie to żuć więcej pamięci RAM, będziesz miał dużo Więcej sąsiadującej wirtualnej przestrzeni adresowej, a przydzielenie 2GB sąsiadującej byłoby trywialne.

 118
Author: Christopher Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-31 00:02:39

Ma to związek z pamięcią ciągłą.

Oto kilka informacji, które znalazłem w internecie dla kogoś, kto pytał o to wcześniej, rzekomo od "Boga VM":

Powód, dla którego potrzebujemy pamięci ciągłej region dla sterty jest to, że mamy kilka pobocznych struktur danych, które są indeksowane przez (skalowane) przesunięcia z początek sterty. Na przykład, my Śledzenie aktualizacji odniesienia do obiektu za pomocą "card mark array", która ma jeden bajt dla każdego 512 bajtów sterty. Kiedy my sklep odniesienie w stercie mamy aby zaznaczyć odpowiedni bajt w tablica znaków kart. We right shift the adres docelowy sklepu oraz użyj tego do indeksowania tablicy znaczników kart. Zabawa adresowanie arytmetyka gry Ty nie da się zrobić w Javie, do której się dostać (mieć do: -) graj w C++.

Zazwyczaj nie mamy problemów z uzyskaniem skromne sąsiadujące ze sobą regiony (do ok. 1,5 GB na Windohach, do około 3,8 GB na Solarisie. YMMV.). On Windohs, the problem polega głównie na tym, że są niektóre biblioteki, które zostaną załadowane przed JVM uruchamia się, że rozbija przestrzeń adresowa. Korzystanie z przełącznika / 3GB nie zmieni tych bibliotek, więc nadal stanowią dla nas problem.

Wiemy, jak zrobić grube stosy, ale byłoby trochę kosztów na wykorzystanie oni. Mamy więcej próśb o szybsze zarządzanie magazynem niż robimy dla większe hałdy w 32-bitowym JVM. Jeśli naprawdę chcą dużych hałd, przełączyć się na 64-bitowy JVM. Nadal potrzebujemy ciągłych pamięć, ale to dużo łatwiej dostać się do środka 64-bitowa przestrzeń adresowa.

 49
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-31 01:26:14

Limity rozmiaru sterty Javy Dla Windows wynoszą:

  • Maksymalny możliwy rozmiar sterty w 32-bitowej Javie: 1.8 GB
  • zalecane ograniczenie rozmiaru Sterty Dla 32-bitowej Javy: 1.5 GB (lub 1.8 GB z opcją / 3GB)

To nie pomoże ci uzyskać większą stertę Javy, ale teraz wiesz, że nie możesz wyjść poza te wartości.

 19
Author: MicSim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-22 07:10:05

Oracle JRockit , który może obsługiwać nieciągłą stertę, może mieć stertę Javy o rozmiarze 2,85 GB w systemie Windows 2003/XP z przełącznikiem / 3GB. Wydaje się, że fragmentacja może mieć duży wpływ na to, jak duża może być sterta Javy.

 10
Author: Kire Haglin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-06 00:58:46

JVM potrzebuje sąsiedniej pamięci i w zależności od tego, co jeszcze jest uruchomione, co było uruchomione wcześniej i jak windows zarządzał pamięcią, możesz być w stanie uzyskać do 1,4 GB sąsiedniej pamięci. Myślę, że 64bitowe okna pozwolą na większe hałdy.

 6
Author: James A. N. Stauffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-05 04:26:43

JVM Sun ' a wymaga przylegającej pamięci. Tak więc maksymalna ilość dostępnej pamięci jest podyktowana fragmentacją pamięci. Zwłaszcza biblioteki DLL sterowników mają tendencję do fragmentacji pamięci podczas ładowania do określonego predefiniowanego adresu bazowego. Tak więc twój sprzęt i jego sterowniki określają, ile pamięci można uzyskać.

Dwa źródła na to z wypowiedziami inżynierów Sun: forum blog

Może inny JVM? Próbowałeś Harmony ? Myślę, że planowali pozwolić pamięć nieciągła.

 6
Author: the.duckman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 19:59:41

Myślę, że ma to więcej wspólnego z tym, jak Windows jest skonfigurowany tak, jak sugeruje ta odpowiedź: Java-Xmx Option

Jeszcze kilka testów: udało mi się przeznaczyć 1300MB na starym komputerze z systemem Windows XP z tylko 768MB fizycznej pamięci RAM (Plus pamięć wirtualna). Na mojej maszynie 2GB RAM mogę dostać tylko 1220MB. Na różnych innych firmowych maszynach (ze starszym Windows XP) udało mi się uzyskać 1400MB. Urządzenie z limitem 1220MB jest całkiem nowe (właśnie zakupione od della), więc może ma nowsze (i więcej nadęty) Windows i Dll (działa Windows XP Pro w wersji 2002 SP2).

 3
Author: Steve Kuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-05 23:48:23

Dostałem ten Komunikat o błędzie podczas uruchamiania programu java z (ograniczonej pamięci) virtuozzo VPS. Nie podałem żadnych argumentów pamięci i stwierdziłem, że musiałem jawnie ustawić małą , ponieważ domyślna wartość musiała być zbyt wysoka. Np.-Xmx32m (oczywiście musi być dostrojony w zależności od uruchomionego programu).

Po prostu umieszczam to tutaj na wypadek, gdyby ktoś inny otrzymał powyższy komunikat o błędzie bez podania dużej ilości pamięci, tak jak pytający.

 2
Author: William Denniss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-07 02:38:34

JDK/JRE firmy Sun wymaga sporej ilości pamięci, jeśli przydzielisz ogromny blok.

SYSTEM OPERACYJNY i początkowe aplikacje mają tendencję do przydzielania bitów i kawałków podczas ładowania, które fragmentują dostępną pamięć RAM. Jeśli sąsiedni blok nie jest dostępny, SUN JDK nie może go użyć. JRockit z Bea (nabyty przez Oracle) może przydzielać pamięć z kawałków.

 1
Author: anjanb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-05 05:09:02

Wydaje się, że wszyscy odpowiadają na temat sąsiedniej pamięci, ale zapomnieli przyznać się do bardziej palącej kwestii.

Nawet przy 100% ciągłej alokacji pamięci nie można mieć sterty 2 GiB w 32-bitowym systemie operacyjnym Windows (domyślnie*). Dzieje się tak, ponieważ 32-bitowe procesy systemu Windows nie mogą zająć więcej niż 2 GiB miejsca.

Proces Java będzie zawierał Perm gen( pre Java 8), rozmiar stosu na wątek, narzut JVM / library (który zwiększa się z każdą kompilacją) wszystko w dodatek do sterty .

Ponadto znaczniki JVM i ich domyślne wartości zmieniają się między wersjami. Po prostu uruchom następujące, a dowiesz się czegoś:

 java -XX:+PrintFlagsFinal

Wiele opcji wpływa na podział pamięci w stercie i poza nią. Zostawiając ci mniej więcej te 2 GiB do zabawy...

Aby ponownie użyć części ta {[15] } moja odpowiedź (o Tomcacie, ale dotyczy każdego procesu Javy):

SYSTEM OPERACYJNY Windows ogranicza alokację pamięci 32-bitowej proces do 2 GiB w sumie (przez domyślnie).

[będziesz mógł tylko] przydzielić około 1,5 GiB sterty przestrzeń, ponieważ do procesu przypisana jest również inna pamięć (narzut JVM / library, przestrzeń gen Perm itp.).

Dlaczego 32-bitowy System Windows nakłada ograniczenie przestrzeni adresowej procesu o 2 GB, ale 64-bitowy Windows narzuca limit 4GB?

Inne nowoczesne systemy operacyjne [[1]] pozwalają 32-bitowym procesom na użyj wszystkich (lub większości) z 4 GiB przestrzeń adresowalna.

To powiedziawszy, 64-bitowe systemy operacyjne Windows mogą być skonfigurowane w celu zwiększenia limitu z procesów 32-bitowych do 4 GiB (3 GiB na 32-bitach):

Http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778 (v=vs.85). aspx

 1
Author: Mikaveli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:46

Oto jak zwiększyć rozmiar stronicowania

  1. Kliknij prawym przyciskiem myszy na mycomputer--->properties - - - > Advanced
  2. w sekcji Wydajność kliknij Ustawienia
  3. Kliknij zakładkę Zaawansowane
  4. w sekcji Pamięć wirtualna kliknij Zmień. Pokaże aktualne stronicowanie ur rozmiar.
  5. Wybierz dysk, na którym jest dostępne miejsce na dysku twardym.
  6. podaj rozmiar początkowy i maksymalny ...np. początkowy rozmiar 0 MB i maksymalny rozmiar 4000 MB. (Tyle ile potrzebujesz)
 0
Author: Israel Margulies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-17 21:25:44

Po pierwsze, używanie pliku strony, gdy masz 4 GB PAMIĘCI RAM, jest bezużyteczne. Windows nie ma dostępu do więcej niż 4GB (w rzeczywistości mniej z powodu dziur w pamięci), więc Plik strony nie jest używany.

Po drugie, przestrzeń adresowa jest podzielona na 2, połowę dla jądra, połowę dla trybu użytkownika. Jeśli potrzebujesz więcej pamięci RAM dla swoich aplikacji, użyj opcji /3GB w boot.ini (właśc.exe jest oznaczony jako "duży adres świadomy" (google Więcej informacji).

Po Trzecie, myślę, że nie można przydzielić pełnych 2 GB przestrzeni adresowej ponieważ java marnuje trochę pamięci wewnętrznie (dla wątków, kompilatora JIT, inicjalizacji maszyn wirtualnych itp.). Użyj przełącznika /3GB, aby uzyskać więcej.

 -1
Author: user17544,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 23:12:22