Poprawka: wystąpił błąd podczas inicjowania maszyny wirtualnej, nie można było zarezerwować wystarczającej ilości miejsca na stertę obiektów

Mimo że aplety Java nie są obecnie popularną technologią internetową, istnieje niezliczona liczba powodów, aby wdrożyć wirtualną maszynę Java bezpośrednio na serwerze Linux. Jeśli spróbujesz bezpośrednio uruchomić polecenie java systemu Linux na oddzielnym sprzęcie lub na własnej maszynie wirtualnej, może pojawić się komunikat „Wystąpił błąd podczas inicjowania maszyny wirtualnej nie udało się zarezerwować wystarczającej ilości miejsca na stertę obiektów”.

Prawdopodobnie wygląda to dość dziwnie, ponieważ najprawdopodobniej masz wystarczającą ilość pamięci RAM, aby uruchomić polecenie, ale w dużej mierze jest to spowodowane określonym dziwactwem w sposobie wykorzystywania stron pamięci fizycznej i wirtualnej. Określenie niektórych stosunkowo dużych rozmiarów powinno umożliwić całkowite pominięcie tego komunikatu i uruchomienie polecenia java w taki sam sposób, jak każdy inny.

Metoda 1: Korzystanie z opcji wiersza poleceń

Jeśli próbowałeś uruchomić java i otrzymałeś ten komunikat, prawdopodobnie uruchomiłeś już darmowe polecenie, aby upewnić się, że jest wystarczająco dużo pamięci, aby uruchomić program.

java i darmowe polecenia

Zauważ, że na naszej maszynie testowej mieliśmy około 2,3 GB fizycznej pamięci RAM i ani jedna strona pamięci wirtualnej nie została jeszcze wykorzystana. Jeśli zauważysz, że masz problemy z pamięcią, będziesz chciał zamknąć inne uruchomione rzeczy, zanim spróbujesz ponownie. Z drugiej strony ci, którzy stwierdzili, że mają dużo wolnej pamięci, mogą spróbować bezpośrednio określić rozmiar.

Na przykład na naszej maszynie mogliśmy uruchomić polecenie jako java -Xms256m -Xmx512M i działało tak, jak by się tego spodziewano. Ogranicza to wielkość sterty, którą maszyna wirtualna Java próbuje zarezerwować podczas uruchamiania. Ponieważ nieograniczona maszyna wirtualna może hipotetycznie robić nietypowe rzeczy, może generować komunikaty o błędach w systemie, który w przeciwnym razie jest wolny. Możesz także pobawić się tymi dwiema wartościami, zanim znajdziesz odpowiednią kombinację.

Może to stanowić problem niezależnie od tego, na czym go uruchamiasz, ponieważ JVM nie ma nic wspólnego z typem maszyny wirtualnej, której możesz używać do uruchamiania systemu GNU / Linux.

Metoda 2: Eksportowanie zmiennych, aby zmiana stała się trwała

Gdy znajdziesz działającą wartość, możesz ją wyeksportować, aby była stała dla tej sesji. Na przykład użyliśmy export _JAVA_OPTIONS = '- Xms256M -Xmx512M' z wiersza poleceń bash i pozwoliło nam to uruchomić samo polecenie java bez żadnych innych opcji, dopóki nie wylogujemy się z naszego serwera.

Musiał zostać uruchomiony ponownie, gdy zalogowaliśmy się w innej sesji, więc możesz chcieć dodać go do odpowiednich skryptów startowych, jeśli planujesz dość często używać polecenia java. Dodaliśmy tę linię do naszego pliku .bash_login i wydawało się, że działa za każdym razem, gdy korzystaliśmy z zachęty do logowania, bez konieczności ponownego uruchamiania go, chociaż może być konieczne znalezienie innej lokalizacji, jeśli pracujesz z inną powłoką.

Być może zauważyłeś, że tylko niektóre konfiguracje sprzętowe wyzwalają ten komunikat o błędzie. Dzieje się tak dlatego, że zwykle dzieje się to na komputerach z dużą ilością fizycznej pamięci RAM, ale niższymi limitami, jak z niej korzystać. Java spróbuje przydzielić ogromny blok tylko po to, aby usłyszeć, że nie może, co interpretuje jako brak pamięci.

Metoda 3: Drukowanie aktualnych opcji Java

Jeśli pracujesz w wierszu poleceń i chcesz uzyskać szybkie odniesienie do tego, na co aktualnie ustawiłeś wartość _JAVA_OPTIONS, po prostu uruchom echo $ _JAVA_OPTIONS, a natychmiast wydrukuje bieżące wartości. Jest to przydatne do rozwiązywania problemów, gdy próbujesz znaleźć właściwe cyfry do wypróbowania.

Należy pamiętać, że chociaż ta poprawka nie powinna wymagać żadnej innej zabawy, Java wyrzuci komunikat „nie można zarezerwować wystarczającej ilości miejsca na stertę obiektów”, jeśli kiedykolwiek znajdziesz się naprawdę na krótkim końcu pamięci wirtualnej. W takim przypadku warto dokładnie sprawdzić, jakie procesy są obecnie uruchomione i prawdopodobnie ponownie uruchomić serwer, jeśli jest taka opcja. Możesz także stworzyć więcej przestrzeni wymiany, ale jeśli jest to problem, generalnie lepiej jest spróbować go poprawić w inny sposób.

W rzadkich przypadkach, gdy ustawienia wydają się być prawidłowe, ale nadal nie działają, upewnij się, że zainstalowałeś 64-bitowy pakiet Java, ponieważ powinien być odporny na ten problem. Ciągłe wymagania dotyczące pamięci dotyczą tylko 32-bitowej wersji języka Java. Znaleźliśmy w kilku przypadkach, że wersja 64-bitowa próbowała utworzyć 32-bitową maszynę wirtualną, więc określenie opcji -d64 w wierszu poleceń naprawiło to za nas.