Oplossing: er is een fout opgetreden tijdens de initialisatie van de VM, kon niet genoeg ruimte reserveren voor de objectheap



Probeer Ons Instrument Voor Het Oplossen Van Problemen

Hoewel Java-applets tegenwoordig geen populaire webtechnologie zijn, zijn er talloze redenen om een ​​virtuele Java-machine rechtstreeks op een Linux-server te implementeren. Als u de Linux Java-opdracht rechtstreeks op discrete hardware of in de eigen VM probeert uit te voeren, krijgt u mogelijk het bericht 'Fout opgetreden tijdens initialisatie van VM kon niet genoeg ruimte reserveren voor objectheap'.



Dit ziet er waarschijnlijk nogal vreemd uit omdat je waarschijnlijk genoeg RAM hebt om de opdracht uit te voeren, maar het is grotendeels te wijten aan een specifieke eigenaardigheid in de manier waarop fysieke en virtuele geheugenpagina's worden gebruikt. Als u enkele relatief grote formaten specificeert, zou u dit bericht volledig moeten omzeilen en het java-commando uitvoeren zoals u dat zou doen.



Methode 1: Command Line-opties gebruiken

Als je hebt geprobeerd Java uit te voeren en dit bericht hebt gekregen, heb je waarschijnlijk al de gratis opdracht uitgevoerd om ervoor te zorgen dat er voldoende geheugen beschikbaar is om het programma uit te voeren.



java en gratis opdrachten

Merk op dat we op onze testmachine ongeveer 2,3 GB fysiek RAM hadden en dat er nog geen enkele pagina virtueel geheugen was gebruikt. Als u merkt dat u een geheugencrisis heeft, wilt u andere actieve dingen sluiten voordat u het opnieuw probeert. Aan de andere kant kunnen degenen die hebben ontdekt dat ze voldoende vrij geheugen hebben, proberen om rechtstreeks een grootte op te geven.

Op onze computer konden we bijvoorbeeld het commando uitvoeren als java -Xms256m -Xmx512M en het werkte zoals het anders zou zijn verwacht. Dit beperkt de heapgrootte die de virtuele Java-machine probeert te reserveren bij het opstarten. Omdat een ongeremde virtuele machine hypothetisch ongebruikelijke dingen zou kunnen doen, kan deze foutmeldingen op een verder vrij systeem genereren. Misschien wil je ook met die twee waarden spelen voordat je de juiste combinatie vindt.



Dit kan een probleem zijn, ongeacht waarop u het uitvoert, aangezien de JVM niets te maken heeft met het type VM dat u mogelijk gebruikt om GNU / Linux uit te voeren.

Methode 2: de variabelen exporteren om de wijziging permanent te maken

Als u een waarde vindt die werkt, kunt u deze exporteren om deze permanent te maken voor die sessie. We gebruikten bijvoorbeeld export _JAVA_OPTIONS = ’- Xms256M -Xmx512M’ vanaf de bash-opdrachtprompt en het stelde ons in staat om het java-commando zelf uit te voeren zonder enige andere opties totdat we uitlogden bij onze server.

Het moest opnieuw worden uitgevoerd toen we in een andere sessie inlogden, dus misschien wil je het toevoegen aan relevante opstartscripts als je van plan bent om het java-commando vrij vaak te gebruiken. We hebben de regel aan ons .bash_login-bestand toegevoegd en het leek te werken elke keer dat we een inlogprompt gebruikten zonder deze opnieuw uit te voeren, hoewel je er misschien een andere locatie voor moet zoeken als je met een andere shell werkt.

Het is u misschien opgevallen dat alleen bepaalde hardwareconfiguraties deze foutmelding activeren. Dat komt omdat het meestal gebeurt op machines met veel fysiek RAM, maar met lagere limieten voor het gebruik ervan. Java zal proberen een enorm blok toe te wijzen om te horen dat het niet kan, wat het interpreteert als een tekort aan geheugen.

Methode 3: huidige Java-opties afdrukken

Als je op de opdrachtregel hebt gewerkt en een snelle referentie wilt naar waar je momenteel de _JAVA_OPTIONS -waarde op hebt ingesteld, voer dan gewoon echo $ _JAVA_OPTIONS uit en het zal onmiddellijk de huidige waarden afdrukken. Dit is handig voor het oplossen van problemen wanneer u de juiste cijfers probeert te vinden.

Houd er rekening mee dat hoewel deze oplossing geen ander spel vereist, Java het bericht 'Kan niet genoeg ruimte voor objectheap reserveren' weggooit als je ooit echt aan de korte kant van het virtuele geheugen komt. Als dit het geval is, moet u controleren welke processen momenteel worden uitgevoerd en eventueel de server opnieuw opstarten als dat een optie is. U kunt ook meer swapruimte creëren, maar als dit een probleem is, is het over het algemeen beter om te proberen het op een andere manier te corrigeren.

In het zeldzame geval dat uw instellingen juist lijken maar het nog steeds niet werkt, moet u ervoor zorgen dat u het 64-bits Java-pakket heeft geïnstalleerd, aangezien het immuun zou moeten zijn voor dit probleem. Aaneengesloten geheugenvereisten zijn alleen van toepassing op de 32-bits versie van Java. We ontdekten dat in een handvol gevallen de 64-bits versie probeerde een 32-bits virtuele machine te maken, dus het specificeren van de -d64-optie op de opdrachtregel loste dit voor ons op.

3 minuten gelezen