Nie można zarezerwować wystarczającej ilości miejsca na stertę obiektu


277

Za każdym razem, gdy próbuję uruchomić program, otrzymuję następujący wyjątek.

Wystąpił błąd podczas inicjowania maszyny wirtualnej

Nie można zarezerwować wystarczającej ilości miejsca na stertę obiektu

Nie można utworzyć wirtualnej maszyny Java.

Próbowałem zwiększyć swoją pamięć wirtualną (rozmiar strony) i rozmiar pamięci RAM, ale bezskutecznie.

Jak mogę wyeliminować ten błąd?



2
Ten błąd pojawia się również podczas używania jdk / jre 1.6 na mojej maszynie wirtualnej, próbowałem zmienić wartości konfiguracyjne podane w komentarzach, ale to nie pomogło, po aktualizacji do jdk 1.7 błąd zniknął i zastosowano większe parametry Xmx. Wydaje się, że istnieje wiele zmian w stosowaniu sterty od czasu java 1.6.
Alexander.Iljushkin

Odpowiedzi:


214

Uruchom JVM z -XX:MaxHeapSize=512m(lub dowolną dużą liczbą, jak potrzebujesz) (lub -Xmx512mw skrócie)


42
Lub krótszy, -mx256m lub -mx512m;)
Peter Lawrey

8
Czy -mx jest takie samo jak -Xmx i -XX: MaxHeapSize?
Erty Seidohl,

19
Dzięki .. okazuje się, że zbyt duża liczba może również stanowić problem i może powodować ten sam błąd!
Dinesh Rajan

17
Czy ktoś znalazł rozwiązanie, które faktycznie działa w 100% przypadków? To rozwiązanie tymczasowo rozwiązuje problem, ale potem nagle wraca. Mam 16 GB pamięci RAM i mam dość tego gówna. W dawnych czasach wszystko było lepiej: [
Nilzor

6
Nie działa dla mnie w systemie Windows 8 z Javą x86 lub x64.
AndrewSmiley

128

Może to być również spowodowane ustawieniem czegoś zbyt dużego w 32-bitowej HotSpot vm, na przykład:

-Xms1536m -Xmx1536m

gdzie to może / mogłoby działać:

-Xms1336m -Xmx1336m

5
Zapomniałem wspomnieć, że ten problem musiałby wystąpić podczas uruchamiania w 32-bitowej powłoce poleceń. 64-bitowa powłoka poleceń może nie mieć tego problemu.
djangofan,

Dla mnie nie powiodło się z wartością domyślną i wartością zbyt dużą, więc upewnij się, że wypróbowałeś wiele wartości. Dziękuję za odpowiedź!
Trax

47

oto jak to naprawić:

  • Przejdź do Start-> Panel sterowania-> System-> Zaawansowane (zakładka) -> Zmienne środowiskowe-> System

    Zmienne-> Nowe: Nazwa _JAVA_OPTIONS zmiennej: Wartość -Xmx512M zmiennej: Nazwa Path
    zmiennej: Wartość zmiennej:%PATH%;C:\Program Files\Java\jre6\bin;F:\JDK\bin;

Zmień to na odpowiednią ścieżkę.


1
Bardzo podobna do tej odpowiedzi , powiedziałbym ...
That1Guy

Dobry. Wraz z powyższym odsyłamy również do tego. stackoverflow.com/a/9350506/967638
Amarnath,

46

Natknąłem się na to podczas korzystania z javaca i wydaje się, że nie wykrywa to opcji wiersza poleceń,

-bash-3.2$ javac -Xmx256M HelloWorldApp.java 
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

więc rozwiązanie tutaj ustawia więc _JAVA_OPTIONS

-bash-3.2$ export _JAVA_OPTIONS="-Xmx256M"
-bash-3.2$ javac HelloWorldApp.java 
Picked up _JAVA_OPTIONS: -Xmx256M

I to dobrze się kompiluje.

Zdarza mi się to na komputerach z dużą ilością pamięci RAM, ale z niższymi limitami pamięci. Java decyduje się przydzielić dużą stertę, ponieważ wykrywa pamięć RAM w maszynie, ale nie może jej przydzielić z powodu ulimits.


1
+1 za wskazanie _JAVA_OPTIONS - w moim przypadku java jest wywoływana gdzieś głęboko w skrypcie powłoki, do którego nie mam dostępu do zapisu, więc ta opcja jest lepsza.
gerrit

To samo tutaj. Używam komputerów uniwersyteckich, więc nie jestem administratorem (nie mogę zmieniać zmiennych środowiskowych), a opcja wiersza poleceń w ogóle nie działała. Dzięki wielkie!
Kimbluey,

38

32-bitowa Java wymaga ciągłego wolnego miejsca w pamięci do uruchomienia. Jeśli określisz duży rozmiar sterty, może nie być tak dużo ciągłego wolnego miejsca w pamięci, nawet jeśli masz dużo więcej wolnego miejsca niż to konieczne.

Zainstalowanie 64-bitowej wersji Java pomaga w takich przypadkach, ciągłe wymagania dotyczące pamięci dotyczą tylko 32-bitowej Java.


1
Myślę, że to najlepsza odpowiedź w przypadku, gdy błąd nadal występuje po użyciu opcji -Xmx [numer seryjny] m. Pomógł mi poprawnie uruchomić Apache jMeter.
RuudvK

Stworzyłem zupełnie nowy projekt, bez kodu innego niż automatycznie generowana główna aktywność, i spowodował ten błąd
behelit

1
I drugi @RuudvK. Zainstalowanie 64-bitów pozwoliło mi zwiększyć maksymalną pamięć podczas usuwania błędu alokacji pamięci. To powinna być zaakceptowana odpowiedź.
J Weezy,

28

W połączeniu z -Xmx512M użyj -d64, aby upewnić się, że używasz 64-bitowej maszyny wirtualnej. Na maszynie 64-bitowej na pewno myślałem, że mam 64-bitową maszynę wirtualną, ale nie. Po zainstalowaniu 64-bitowej Java opcja -d64 działa, a -Xmx pozwala na znacznie większe rozmiary pamięci.

java -d64 -Xmx512M mypackage.Test

4
Ta odpowiedź powinna być na górze. Spędziłem dwa miesiące walcząc z tym problemem, aby zdać sobie sprawę, że zainstalowanie 64-bitowej Java rozwiązało problem (w moim przypadku opcja -d64 nie była konieczna)
Nilzor,

Pobrano _JAVA_OPTIONS: -d64 -Xmx1024M Nierozpoznana opcja: -d64 Nie można uruchomić maszyny JVM. Maksymalny rozmiar sterty (-Xmx) może być zbyt duży lub narzędzie antywirusowe lub zapora może blokować wykonanie.
Alexander

14

Otrzymałem ten sam błąd i rozwiązałem go, konfigurując go w pliku run.conf.bat

Uruchom JVM z konfigurującym run.conf.bat w Jboss5x

Jeśli wolna pamięć nie jest dostępna, gdy przekazujesz instrukcję, wprowadź zmiany w pliku run.conf.bat

set "JAVA_OPTS=-Xms512m -Xmx512m -XX:MaxPermSize=256m"

7

Wiem, że jest tu już wiele odpowiedzi, ale żadna z nich mi nie pomogła. Na koniec otworzyłem plik /etc/elasticsearch/jvm.optionsi zmieniłem:

-Xms2G
-Xmx2G

do

-Xms256M
-Xmx256M

To dla mnie rozwiązało. Mam nadzieję, że pomoże to komuś innemu tutaj.


7

Miałem podobne problemy. Zainstalowałem 32-bitową wersję Java na komputerze 64-bitowym.

Odinstalowując tę ​​wersję i instalując 64-bitową wersję Java. Byłem w stanie rozwiązać problem.


6

Załóżmy, że twoja klasa jest wywoływana Testw pakiecie mypackage. Uruchom swój kod w następujący sposób:

java -Xmx1024m mypackage.Test

To zarezerwuje 1024 MB miejsca na stosie dla twojego kodu. Jeśli chcesz 512 MB, możesz użyć:

java -Xmx512m mypackage.Test

Użyj trochę mw 1024m, 512mitp


6

Czasami ten błąd wskazuje, że pamięć fizyczna i zamiana na serwerze są w pełni wykorzystywane!

Ostatnio widziałem ten problem na serwerze z RedHat Enterprise Linux 5.7 z 48 GB pamięci RAM. Przekonałem się, że nawet po prostu biegam

java -version

spowodował ten sam błąd, który ustalił, że problem nie był specyficzny dla mojej aplikacji.

Bieganie

cat /proc/meminfo

poinformował, że zarówno MemFree, jak i SwapFree były znacznie poniżej 1% wartości odpowiednio MemTotal i SwapTotal:

MemTotal:     49300620 kB
MemFree:        146376 kB
...
SwapTotal:     4192956 kB
SwapFree:         1364 kB

Zatrzymanie kilku innych działających aplikacji na maszynie nieco podniosło liczbę wolnej pamięci:

MemTotal:     49300620 kB
MemFree:       2908664 kB
...
SwapTotal:     4192956 kB
SwapFree:      1016052 kB

W tym momencie nowa instancja Java mogłaby się uruchomić poprawnie i mogłem uruchomić moją aplikację.

(Oczywiście dla mnie było to tylko rozwiązanie tymczasowe; nadal mam wyjątkowe zadanie dokładniejszego zbadania procesów uruchomionych na tym komputerze, aby sprawdzić, czy można coś zrobić, aby zmniejszyć nominalne poziomy wykorzystania pamięci bez konieczność uciekania się od aplikacji).


To samo tutaj, java -versionzawodzi, mimo że top pokazał jeszcze trochę wolnego: | (powiedział także, że wystąpił błąd podczas inicjowania VM Nie można czasem zarezerwować wystarczającej ilości miejsca na tablicę do oznaczania kart). Wydawało się, że poprawką jest uruchamianie na górze, sprawdzanie, które procesy wykorzystują najwięcej pamięci RAM (kolumna VIRT), zabijanie ich [dla mnie postgres, appdynamics]: |
rogerdpack

Czy może to być spowodowane fragmentacją pamięci? W powyższej odpowiedzi wspomniano o ciągłej wolnej przestrzeni.
Rick Moritz

6

Błąd:

Z powodu błędu „wystąpił błąd podczas inicjowania vm, nie można zarezerwować wystarczającej ilości miejsca dla jboss sterty obiektów”

Przyczyna główna:

  • Nieprawidłowy / niewystarczający przydział pamięci dla naszej maszyny JVM, jak wspomniano poniżej.

  • np. JAVA_OPTS = "- Xms1303m -Xmx1303m -XX: MaxPermSize = 256m" w jboss-eap-6.2 \ bin \ standalone.conf lub "JAVA_OPTS = -Xms1G -Xmx1G -XX: MaxPermSize = 256M" w jboss-eap-6.2 \ bin \ standalone.conf.bat, który jest niczym innym jak parametrami puli alokacji pamięci JVM.

Rozdzielczość:

  • Zwiększ rozmiar sterty. Aby zwiększyć rozmiar sterty,
  • goto -> jboss-eap-6.2 \ bin \ standalone.conf.bat lub jboss-eap-6.2 \ bin \ standalone.conf
  • zmień -> JAVA_OPTS = "- Xms256m -Xmx512m -XX: MaxPermSize = 256m" gdzie -Xms to Minimalna wielkość sterty, a -Xmx to Maksymalna wielkość sterty.
  • Zwykle nie zaleca się, aby mieć ten sam rozmiar dla min i maks.

  • Jeśli uruchamiasz aplikację w środowisku Eclipse,

  • Kliknij dwukrotnie serwer
  • wybierz „otwórz konfigurację uruchamiania”, zostaniesz przekierowany do okna „Edytuj właściwości konfiguracji uruchamiania”.
  • W tym okienku musisz przejść do zakładki „(x) = Argumenty”.
  • W Argumentach VM zdefiniuj rozmiar sterty, jak wspomniano poniżej
  • „-Dprogram.name = JBossTools: JBoss EAP 6.1+ Runtime Server” -server -Xms256m -Xmx512m -XX: MaxPermSize = 256m -Dorg.jboss.resolver.warning = true

Cytat z wiersza poleceń Oracle : „ Aby uzyskać najlepszą wydajność, ustaw -Xms na taki sam rozmiar jak maksymalny rozmiar sterty, na przykład:java -Xgcprio:throughput -Xmx:64m -Xms:64m myApp
user1438038,

3

Ostatnio napotkałem ten problem. Mam 3 aplikacje Java, które zaczynają się z wielkością sterty 1024m lub 1280m. Java szuka dostępnej przestrzeni w swapie, a jeśli nie ma wystarczającej ilości pamięci, jvm kończy działanie.

Aby rozwiązać ten problem, musiałem zakończyć kilka programów z przydzieloną dużą ilością pamięci wirtualnej.

Pracowałem na Linuksie x86-64 z 64-bitowym jvm.


3

Miałem odpowiednią ilość ustawień pamięci, ale dla mnie korzystałem z 64-bitowego intellij z 32-bitowym jvm. Po przejściu na 64-bitową maszynę wirtualną błąd zniknął.



2

Jeśli używasz 32-bitowej maszyny JVM, zmiana wielkości sterty na mniejszą byłaby prawdopodobnie pomocna. Możesz to zrobić, przekazując argumenty do java bezpośrednio lub poprzez zmienne środowiskowe, takie jak następujące,

java -Xms128M -Xmx512M
JAVA_OPTS="-Xms128M -Xmx512M"

W przypadku 64-bitowej maszyny JVM większy rozmiar sterty, taki jak -Xms512M -Xmx1536M powinien działać .

Uruchom java -versionlub java -d32, java--d64aby Java7 sprawdził, którą wersję uruchomisz.


1

W każdym razie, oto jak to naprawić: Przejdź do Start-> Panel sterowania-> System-> Zaawansowane (zakładka) -> Zmienne środowiskowe-> Zmienne systemowe-> Nowe: Nazwa zmiennej: _JAVA_OPTIONS Wartość zmiennej: -Xmx512M

LUB

Zmień połączenie mrówki, jak pokazano poniżej.

   <exec
        **<arg value="-J-Xmx512m" />**
    </exec>

To zadziałało dla mnie.


1

Wystąpił błąd podczas inicjowania maszyny wirtualnej. Nie można zarezerwować wystarczającej ilości miejsca na stertę obiektów 1572864 KB

Zmieniłem wartość pamięci w pliku settings.grade 1536 na 512 i to pomogło


1

Przejdź do Start-> Panel sterowania-> System-> Zaawansowane (zakładka) -> Zmienne środowiskowe-> Zmienne systemowe-> Nowość:

Variable name: _JAVA_OPTIONS
Variable value: -Xmx512M

Ustawienie tego globalnie ogranicza wielkość sterty, którą można podać IntelliJ.
user3056052,

0

W przypadku uruchamiania programu Java: - uruchom swój program w terminalu, używając poprawnego polecenia dla systemu Linux, będzie to „java -jar myprogram.jar” i dodaj -Xms256m -Xmx512m, na przykład: „java -jar myprogram.jar Xms256m -Xmx512m ”

Jeśli używasz skryptu .sh (Linux, Mac?) Lub .bat (Windows), otwórz skrypt i poszukaj opcji Java, jeśli są obecne i zwiększ pamięć.

Jeśli wszystkie powyższe nie działają, sprawdź swoje procesy (ctrl + alt + delete w Windows) (ps aux na linux / mac) i zabij procesy, które wykorzystują dużo pamięci i nie są konieczne dla twojego systemu operacyjnego! => Spróbuj ponownie uruchomić program.


0

W CASSANDRA_HOME / bin / cassandra.bat znajdziesz następującą konfigurację

REM JVM Opts we'll use in legacy run or installation
set JAVA_OPTS=-ea^
 -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.0.jar"^
 -Xms**2G**^
 -Xmx**2G**^

Możesz zmniejszyć 2G do mniejszej liczby, np. 1G lub nawet mniejszej, i powinno to działać.

To samo, jeśli pracujesz na systemie unix, odpowiednio zmień plik .sh.


0

Wystąpił ten sam błąd i został rozwiązany, gdy usunąłem pliki tymczasowe za pomocą% temp% i ponownie uruchomiłem zaćmienie.


0

Czasami odnosi się to do

$ sysctl vm.overcommit_memory
vm.overcommit_memory = 2

Jeśli ustawisz na:

$ sysctl vm.overcommit_memory=0

To powinno działać.


0

Wymień -Xmx2Gsię -Xms512Mlub jakikolwiek większy rozmiar pamięci w pliku cassandra.bat w katalogu bin Cassandra.


0

Otwórz plik gradle.properties w folderze Androida.

Zamień ten wiersz:

org.gradle.jvmargs=-Xmx1536M

z:

org.gradle.jvmargs=-Xmx512m

Objaśnienie: Maksymalny limit z dokumentu Gradle:

Jeśli żądane środowisko kompilacji nie określa maksymalnego rozmiaru sterty, demon zużyje do 512 MB sterty.


-2

Nie musisz nic robić po prostu zmieniając plik POM jak poniżej

<configuration>
    <maxmemory>1024M</maxmemory>
</configuration>

2
Kto powiedział coś o pliku POM?
Henley Chiu,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.