Не можах да запазя достатъчно място за купчина обекти

1. Общ преглед

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

2. Симптоми

„Не може да запази достатъчно място за купчина обект“ е специфична JVM грешка, която се появява, когато Java процесът не може да създаде виртуалната машина поради ограничения на паметта, срещнати в работещата система:

java -Xms4G -Xmx4G -jar HelloWorld.jar 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.

Като цяло има два възможни сценария, когато срещнем грешката.

Първо, когато обядваме Java процес с параметър за максимален размер на купчина ( -Xmx ) и стойността е повече от това, което процесът може да има в операционната система .

Ограничението за размера на купчината варира в зависимост от няколко ограничения:

  • хардуерна архитектура (32/64 бита)
  • JVM битова версия (32/64 бита)
  • операционната система, която използваме

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

3. Размер на купчината

Пространството на купчина Java е пул за разпределение на памет за изпълнението на Java програмата, управляван от самия JVM. По подразбиране пулът за разпределение е ограничен до първоначалния и максималния размер. За да научите повече за Heap Space в Java, погледнете тази статия тук.

Нека да видим какъв е максималният размер на купчината в различни среди и как можем да зададем ограниченията.

3.1. Максимален размер на купчината

Максималната теоретична граница на купчина за 32-битовата и 64-битовата JVM е лесно да се определи чрез разглеждане на наличното пространство в паметта, 2 ^ 32 (4 GB) за 32-битова JVM и 2 ^ 64 (16 екзабайта) за 64- малко JVM.

На практика, поради различни ограничения, ограничението може да бъде много по-ниско и варира в зависимост от операционната система. Например на 32-битови системи с Windows максималният обхват на размера на купчината е между 1,4 GB до 1,6 GB . За разлика от това, при 32-битови Linux системи, максималният размер на купчината може да се простира до 3 GB.

Поради тази причина, ако приложението изисква голяма купчина, трябва да използваме 64-битовата JVM . Въпреки това, с голяма купчина, събирачът на боклук ще има повече работа, така че е важно да се намери добър баланс между размера на купчината и производителността.

3.2. Как да контролираме границите на размера на купчината?

Имаме две възможности за контрол на ограниченията за размера на купчината на JVM.

Първо, чрез използване на параметрите на командния ред на Java при всяка инициализация на JVM:

-Xms Sets initial Java heap size. This value must be a multiple of 1024 and greater than 1 MB. -Xmx Sets maximum Java heap size. This value must be a multiple of 1024 and greater than 2 MB. -Xmn Sets the initial and maximum size (in bytes) of the heap for the young generation.

За стойността на размера можем да добавим буква k или K , m или M и g или G, за да посочим съответно килобайта, мегабайта и гигабайта. Ако не е посочена буква, се използва единицата по подразбиране (байт).

-Xmn2g -Xmn2048m -Xmn2097152k -Xmn2147483648

На второ място, чрез използване на променлива на околната среда JAVA_OPTS за конфигуриране над параметрите на Java командния ред в световен мащаб. Поради това всяка инициализация на JVM в системата автоматично ще използва конфигурациите, зададени в променливата на средата.

JAVA_OPTS="-Xms256m -Xmx512m"

За повече информация вижте нашето изчерпателно ръководство за параметри на JVM.

4. Заключение

В този урок обсъдихме два възможни сценария, когато JVM не е в състояние да резервира достатъчно място за купчина обекти . Също така научихме как да контролираме ограниченията за размера на купчината, за да смекчим тази грешка.

След това научете повече за потенциалните проблеми с паметта по време на изпълнение и как да ги идентифицирате.