Oprava: Počas inicializácie VM došlo k chybe, ktorá nemohla vyhradiť dostatok priestoru pre haldu objektov



Vyskúšajte Náš Nástroj Na Odstránenie Problémov

Aj keď applety Java dnes nie sú populárnou webovou technológiou, existuje nespočetné množstvo dôvodov na nasadenie virtuálneho stroja Java priamo na server Linux. Ak sa pokúsite spustiť príkaz Linux java priamo na diskrétnom hardvéri alebo vo vnútri vlastného VM, môže sa zobraziť správa „chyba počas inicializácie VM nemohla vyhradiť dostatok miesta pre haldu objektov“.



To pravdepodobne vyzerá dosť zvláštne, pretože je viac než pravdepodobné, že máte dostatok pamäte RAM na spustenie príkazu, ale je to do značnej miery spôsobené špecifickým problémom v spôsobe, akým sú stránky fyzickej a virtuálnej pamäte zvyknuté. Zadanie niektorých relatívne veľkých veľkostí by vám malo umožniť úplne obísť túto správu a spustiť príkaz java tak, ako by ste to urobili ktokoľvek iný.



Metóda 1: Používanie možností príkazového riadku

Ak ste sa pokúsili spustiť program Java a dostali ste túto správu, pravdepodobne ste už spustili bezplatný príkaz, aby ste sa uistili, že máte dostatok pamäte na spustenie programu.



java a bezplatné príkazy

Všimnite si, že na našom testovacom stroji sme mali asi 2,3 GB fyzickej pamäte RAM a zatiaľ si nezvykla ani jedna stránka virtuálnej pamäte. Ak si všimnete, že máte poruchu pamäte, mali by ste zavrieť ďalšie spustené veci a potom to skúsiť znova. Na druhej strane, tí, ktorí zistili, že majú dostatok voľnej pamäte, sa môžu pokúsiť určiť veľkosť priamo.

Napríklad na našom stroji sme mohli spustiť príkaz ako java -Xms256m -Xmx512M a fungoval to, ako by sa inak čakalo. Toto obmedzuje veľkosť haldy, ktorú sa virtuálny stroj Java pokúša rezervovať pri štarte. Pretože neobmedzený virtuálny stroj by mohol hypoteticky robiť neobvyklé veci, mohol by hádzať chybové správy na inak bezplatný systém. Možno budete tiež chcieť pohrať sa s týmito dvoma hodnotami, kým nájdete tú správnu kombináciu.



To môže byť problém bez ohľadu na to, na čom ho prevádzkujete, pretože JVM nemá nič spoločné s typom VM, ktorý používate na spustenie GNU / Linux.

Metóda 2: Export premenných, aby bola zmena trvalá

Keď nájdete hodnotu, ktorá funguje, môžete ju exportovať, aby bola pre danú reláciu trvalá. Napríklad sme použili export _JAVA_OPTIONS = ‘- Xms256M -Xmx512M’ z príkazového riadku bash a ten nám umožnil spustiť príkaz java sám bez ďalších možností, kým sa neodhlásime z nášho servera.

Keď sme sa prihlásili do inej relácie, bolo potrebné ju znovu spustiť, takže ju môžete pridať do všetkých relevantných spúšťacích skriptov, ak plánujete používať príkaz java pomerne často. Riadok sme pridali do nášho súboru .bash_login a zdá sa, že fungoval zakaždým, keď sme použili výzvu na prihlásenie bez toho, aby sme ju museli znova spustiť. Ak však pracujete s iným shellom, možno budete musieť nájsť iné umiestnenie.

Možno ste si všimli, že toto chybové hlásenie spúšťa iba určité hardvérové ​​konfigurácie. Je to tak preto, lebo sa to zvyčajne deje na strojoch s veľkým množstvom fyzickej pamäte RAM, ale s nižšími obmedzeniami pri ich používaní. Java sa pokúsi prideliť obrovský blok, len aby bolo povedané, že nemôže, čo interpretuje ako nedostatok pamäte.

Metóda 3: Tlač aktuálnych volieb jazyka Java

Ak pracujete na príkazovom riadku a chcete získať rýchly odkaz na to, na čo ste aktuálne nastavili hodnotu _JAVA_OPTIONS, jednoducho spustite echo $ _JAVA_OPTIONS a okamžite vytlačí aktuálne hodnoty. To je užitočné pri riešení problémov, keď sa snažíte zistiť správne číslice, ktoré chcete vyskúšať.

Majte na pamäti, že aj keď táto oprava nebude vyžadovať žiadne ďalšie hranie, Java vyhodí správu „nemohol som vyhradiť dostatok miesta pre haldu objektov“, ak sa niekedy skutočne ocitneš na krátkom konci virtuálnej pamäte. Ak je to váš prípad, budete musieť skontrolovať, ktoré procesy sú momentálne spustené, a prípadne reštartovať server, ak je to možné. Môžete tiež vytvoriť viac odkladacieho priestoru, ale ak je to problém, je lepšie skúsiť ho opraviť iným spôsobom.

V zriedkavých prípadoch, keď sa zdá, že vaše nastavenie je správne, ale stále nefunguje, skontrolujte, či máte nainštalovaný 64-bitový balík Java, pretože by mal byť voči tomuto problému odolný. Požiadavky na súvislú pamäť sa vzťahujú iba na 32-bitovú verziu Java. V niekoľkých prípadoch sme zistili, že 64-bitová verzia sa pokúsila vytvoriť 32-bitový virtuálny stroj, takže zadanie možnosti -d64 na príkazovom riadku to za nás opravilo.

3 minúty prečítané