Поправка: Възникна грешка по време на инициализация на VM не можа да запази достатъчно място за купчина обекти

Въпреки че Java аплетите не са популярна уеб технология в наши дни, има безброй причини да се разположи Java виртуална машина директно на Linux сървър. Ако се опитате да стартирате Linux Java командата направо или на дискретен хардуер, или вътре в собствената му виртуална машина, тогава може да получите съобщение „възникна грешка по време на инициализация на виртуалната машина не може да запази достатъчно място за купчина обекти“.

Това вероятно изглежда доста странно, защото повече от вероятно имате достатъчно RAM, за да стартирате командата, но до голяма степен това се дължи на специфична странност в начина, по който страниците на физическата и виртуалната памет се използват. Посочването на някои относително големи размери трябва да ви позволи напълно да заобиколите това съобщение и да изпълните командата на java по начина, по който бихте направили всяка друга.

Метод 1: Използване на опциите на командния ред

Ако сте се опитали да стартирате java и сте получили това съобщение, вероятно вече сте изпълнили безплатната команда, за да се уверите, че има достатъчно запаси от памет, за да стартирате програмата.

java и безплатни команди

Забележете, че на нашата тестова машина имахме около 2.3 GB физическа RAM и нито една страница виртуална памет все още не беше използвана. Ако забележите, че имате проблем с паметта, тогава ще искате да затворите други неща, които сте изпълнявали, преди да опитате отново. От друга страна, тези, които са открили, че разполагат с достатъчно свободна памет, могат да се опитат да определят размер директно.

Например, на нашата машина успяхме да изпълним командата като java -Xms256m -Xmx512M и тя работеше така, както би се очаквало иначе. Това ограничава размера на купчината, който Java виртуалната машина се опитва да запази при стартиране. Тъй като неограничена виртуална машина може хипотетично да прави необичайни неща, тя може да изпраща съобщения за грешки в иначе безплатна система. Може да искате да си поиграете с тези две стойности, преди да намерите правилната комбинация.

Това може да е проблем, независимо на какво го изпълнявате, тъй като JVM няма нищо общо с типа VM, който може да използвате за стартиране на GNU / Linux.

Метод 2: Експортиране на променливите, за да направи промяната постоянна

Когато намерите стойност, която работи, можете да я експортирате, за да я направите постоянна за тази сесия. Например, ние използвахме export _JAVA_OPTIONS = '- Xms256M -Xmx512M' от командния ред на bash и това ни позволи да стартираме Java командата от само себе си, без никакви други опции, докато не излезем от нашия сървър.

Трябваше да се стартира отново, когато влезнахме в друга сесия, така че може да искате да го добавите към съответните стартови скриптове, ако планирате да използвате командата java доста често. Добавихме реда към нашия .bash_login файл и изглеждаше, че работи всеки път, когато използвахме подкана за влизане, без да се налага да го стартираме отново, въпреки че може да се наложи да намерите друго място за него, ако работите с различна обвивка.

Може би сте забелязали, че само някои хардуерни конфигурации задействат това съобщение за грешка. Това е така, защото обикновено се случва на машини с много физическа RAM, но по-ниски граници за това как да се използва. Java ще се опита да разпредели огромен блок, само за да бъде уведомен, че не може, което тя интерпретира като свършване на паметта.

Метод 3: Печат на текущите опции на Java

Ако сте работили в командния ред и искате бърза справка за това, което в момента сте задали на стойност _JAVA_OPTIONS, тогава просто стартирайте echo $ _JAVA_OPTIONS и той веднага ще отпечата текущите стойности. Това е полезно за отстраняване на неизправности, когато се опитвате да разберете правилните цифри, които да опитате.

Имайте предвид, че макар тази корекция да не изисква никакви други игри, Java ще изхвърли съобщението „не може да запази достатъчно място за купчина обекти“, ако някога се окажете истински в краткия край на виртуалната памет. Ако случаят е такъв, тогава ще искате да проверите отново кои процеси се изпълняват в момента и евентуално да рестартирате сървъра, ако това е опция. Можете също така да създадете повече пространство за суап, но ако това е проблем, обикновено е по-добре да опитате и да го коригирате по друг начин.

В редките случаи, когато настройките ви изглеждат правилни, но все още не работят, уверете се, че сте инсталирали 64-битовия пакет Java, тъй като той трябва да е имунизиран срещу този проблем. Непрекъснатите изисквания за памет се отнасят само за 32-битовата версия на Java. Открихме в няколко случая 64-битовата версия се опита да създаде 32-битова виртуална машина, така че посочването на опцията -d64 в командния ред го поправи за нас.