Як визначається максимальний розмір куки Java за замовчуванням?


420

Якщо я пропущу -Xmxnпараметр з командного рядка Java, то буде використано значення за замовчуванням. Відповідно до документації Java

"значення за замовчуванням вибирається під час виконання на основі конфігурації системи"

Які параметри конфігурації системи впливають на значення за замовчуванням?


1
конфігурація системи означає: а) клієнт jvm проти сервера jvm b) 32bit vs 64bit. Посилання: 1) оновлення від J2SE5.0 docs.oracle.com/javase/6/docs/technotes/guides/vm/… 2) коротка відповідь: docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning /… 3) детальна відповідь: docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/… 4) клієнт проти сервера: javacodegeeks.com/2011/07/jvm-options-client- vs-server.html
Вишнав Рамеш Триссур

2
її важко зрозуміти з вищезазначених посилань. Отже, підсумовуючи їх тут: Максимальний розмір купи для jvm для клієнта - 256 Мб (є виняток, прочитаний за посиланнями вище). Розмір купи Maximun для сервера jvm 32 біт становить 1 Гб, а 64 біт - 32 ГБ (знову ж таки тут є винятки. Будь ласка, прочитайте це за посиланнями). Тож його 256
Мб

Дивіться також stackoverflow.com/a/56036202/32453
rogerdpack

Відповіді:


506

У Windows ви можете скористатись такою командою, щоб дізнатись за замовчуванням у системі, де працюють ваші програми.

java -XX: + PrintFlagsFinal -version | findstr HeapSize

Шукайте варіанти MaxHeapSize(для -Xmx) та InitialHeapSizeдля -Xms.

У системі Unix / Linux ви можете це зробити

java -XX: + PrintFlagsFinal -version | grep HeapSize

Я вважаю, що отриманий результат знаходиться в байтах.


3
Я сподівався на гарний варіант, як цей, але він не працював для мене за допомогою Java 6 VM IBM.
Метт Лавін

Чудово! Чи можу я грати зі всіма цими параметрами за замовчуванням? Яка відповідна змінна ENV для кожного?
Еліст

28
У моєму випадку на Linux, InitialHeapSize = 262803264а MaxHeapSize = 4206886912це приблизно 256 Мб і 4 Гб, якщо я не помиляюся. Чи означає це, що кожен JVM починається так, ніби він був запущений з -Xms256m -Xmx4gопціями?
Юрій Наконечний

9
У системі Windows:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m

1
@matanster У моєму Linux -versionпригнічує довгий текст "використання" stderr.
Франклін Ю

115

Для Java SE 5: Відповідно до ергономіки збирача сміття [Oracle] :

початковий розмір купи:

Більша 1/64-я частина фізичної пам'яті апарату на машині або якийсь розумний мінімум. До J2SE 5.0 початковий розмір купи за замовчуванням був розумним мінімумом, який залежить від платформи. Цей параметр за замовчуванням можна замінити за допомогою параметра командного рядка -Xms.

максимальний розмір купи:

Менше 1/4 фізичної пам'яті або 1 Гб. До J2SE 5.0 максимальний розмір купи за замовчуванням становив 64 Мб. Ви можете змінити цей параметр за замовчуванням за допомогою параметра командного рядка -Xmx.

ОНОВЛЕННЯ:

Як зазначив Том Андерсон у своєму коментарі, вищезазначене стосується машин серверного класу. З ергономіки у віртуальній машині 5.0 JavaTM :

У платформі J2SE версії 5.0 клас машини, який називають машиною серверного класу, визначений як машина з

  • 2 або більше фізичних процесорів
  • 2 або більше Гбайт фізичної пам'яті

за винятком 32-бітових платформ, на яких працює версія операційної системи Windows. На всіх інших платформах значення за замовчуванням збігаються з типовими для версії 1.4.2.

У платформі J2SE версії 1.4.2 за замовчуванням було зроблено наступні вибір

  • початковий розмір купи 4 Мбайт
  • максимальний розмір купи 64 Мбайт

4
Caveat: це для машин серверного класу, а не для клієнтського класу. Вам потрібно прочитати цей документ спільно з java.sun.com/docs/hotspot/gc5.0/ergo5.html, який визначає ці терміни і що відбувається з машинами класу клієнтів. dogbane, чи можу я покірно запропонувати вам відредагувати свою відповідь, щоб процитувати відповідні уривки?
Том Андерсон

3
Це смішно низький дефолт у 2012 році. Дуже мало серйозних додатків поміститься всередині 64 мегабайт.
Марк Е. Хааз

1
Дивіться відповідь Ернесто 30 жовтня 2012 року для клієнтських машин після оновлення Java 6 18.
Енді Томас

Також майте на увазі, що в ньому написано: "Наведені межі та дроби для розміру купи є правильними для J2SE 5.0. Вони, ймовірно, будуть різними в наступних випусках, оскільки комп'ютери стають більш потужними".
Лодовик

До речі, це альго є лише для паралельного збирача сміття.
Майк Аргіріу

45

Java 8 займає більше 1/ 64 частини вашої фізичної пам'яті для вашого Xmssize (Мінімальний розмір HeapSize) і менше 1/4 фізичної пам'яті для вашого -Xmxsize (Максимальний HeapSize).

Ви можете перевірити розмір купи Java за замовчуванням за допомогою:

У Windows :

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

У Linux :

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Які параметри конфігурації системи впливають на значення за замовчуванням?

Машини фізична пам'ять і версія Java.


5
це не 1/64 замість 1/6?
Вишнав Рамеш Триссур

1
Так, Xmssize (Мінімальний розмір HeapSize / InitialHeapSize) становить більше 1/ 64 частини вашої фізичної пам'яті, а Xmxsize (Максимальний розмір HeapSize / MaxHeapSize) менше 1/4 вашої фізичної пам'яті. (Для мого Mac, маючи 16 ГБ оперативної пам’яті, я отримую uintx InitialHeapSize: = 268435456 {product} uintx MaxHeapSize: = 4294967296 {product}, i, e Xms - 268 МБ, а Xmx - 4,29 ГБ
sjeтвані

1
Будь ласка, відредагуйте відповідь. Це 1/64, а не 1/6.
смарагдовий

35

Це змінено в оновлення Java 6 18 .

Якщо припустити, що у нас є більше 1 Гб фізичної пам'яті (досить поширена в наші дні), це завжди 1/4 вашої фізичної пам'яті для сервера vm.


8
Неправильно, на пов’язаній сторінці написаноgreater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Паоло Фулгоні

5
Я щойно перевірив на машині Linux з фізичною пам'яттю 5 Гб. Максимальна купа за замовчуванням відображається як 1,5 Гб
ernesto

1
@PaoloFulgoni немає, ще один практичний приклад, який я зараз спостерігаю: 129 Гбайт фізичної пам'яті призводить до 32 Гбайт максимального розміру купи
Кирило

Див відповідь APL по тому , чому це правильно: stackoverflow.com/a/13310792/32453 Дивіться також stackoverflow.com/a/56036202/32453
rogerdpack

16

Ернесто має рацію. За посиланням, яке він опублікував [1]:

Оновлена ​​конфігурація купи клієнта JVM

У Клієнті JVM ...

  • Максимальний розмір купи за замовчуванням - це половина фізичної пам'яті до розміру фізичної пам'яті 192 мегабайт, інакше одна четверта фізичної пам'яті до розміру фізичної пам'яті 1 гігабайт.

    Наприклад, якщо ваша машина має 128 мегабайт фізичної пам’яті, то максимальний розмір купи становить 64 мегабайти, а більший або рівний 1 гігабайт фізичної пам’яті призводить до максимального розміру куки в 256 мегабайт.

  • Максимальний розмір купи фактично не використовується JVM, якщо ваша програма не створить достатньо об'єктів, щоб вимагати цього. Значно менша кількість, що називається початковим розміром купи, виділяється під час ініціалізації JVM. ...

  • ...
  • Ергономіка купірування сервера JVM тепер така ж, як і у клієнта, за винятком того, що максимальний розмір купи за замовчуванням для 32-бітових JVM становить 1 гігабайт , що відповідає фізичному розміру пам'яті 4 гігабайти, а для 64-бітових JVM - 32 гігабайт , що відповідає до фізичної пам'яті розміром 128 гігабайт.

[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html


9

Для IBM JVM команда така:

java -verbose:sizes -version

Для отримання додаткової інформації про IBM SDK для Java 8: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html ? lang = en


Здається, посилання (ефективно) порушено.
Пітер Мортенсен

@PeterMortensen щойно перевірив - посилання добре
n0mer

8

Нарешті!

На Java 8u191 тепер у вас є варіанти:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

які можна використовувати для розміру купи у відсотках від фізичної оперативної пам'яті. (що таке ж, як встановлена ​​оперативна пам'ять за меншою кількістю використовуваного ядра).

Додаткову інформацію див. У примітках до випуску Java8 u191 . Зауважте, що параметри згадуються в заголовку Докера, але насправді вони застосовуються, чи перебуваєте ви в Докерському середовищі чи в традиційному середовищі.

Значення за замовчуванням MaxRAMPercentage- 25%. Це надзвичайно консервативно.

Моє власне правило: Якщо ваш хост більш-менш присвячений запуску даної програми java, то ви можете без проблем різко зрости. Якщо ви працюєте в Linux, використовуєте лише стандартні демони і встановили оперативну пам’ять десь близько 1 Гбіт і вище, я б не вагався використовувати 75% для купи JVM. Ще раз пам’ятайте, що це 75% доступної оперативної пам’яті , а не встановлена оперативна пам’ять . Залишилося - це інші процеси наземного користування, які можуть працювати на хості та інші типи пам'яті, необхідні JVM (наприклад, для стека). Все разом це, як правило, добре впишеться в ті 25%, що залишилися. Очевидно, що при ще більш встановленій оперативній пам’яті 75% - це більш безпечна і безпечна ставка. (Я хочу, щоб люди JDK реалізували варіант, де можна вказати сходи)

Налаштування MaxRAMPercentageпараметра виглядає так:

java -XX:MaxRAMPercentage=75.0  ....

Зауважте, що ці відсоткові значення мають "подвійний" тип, і тому їх потрібно вказати десятковою крапкою. Ви отримуєте дещо дивну помилку, якщо використовуєте "75" замість "75,0".


7

значення за замовчуванням вибирається під час виконання на основі конфігурації системи

Перегляньте сторінку документації

Розмір купи за замовчуванням

Якщо в командному рядку не вказано початковий і максимальний розміри купи, вони обчислюються виходячи з обсягу пам'яті на машині.

  1. Початкові та максимальні розміри купи клієнта JVM:

    Максимальний розмір купи за замовчуванням - це половина фізичної пам'яті до розміру фізичної пам'яті 192 мегабайт (МБ), інакше одна четверта фізичної пам'яті до розміру фізичної пам'яті 1 гігабайт (ГБ) .

  2. Початкові та максимальні розміри купи JVM сервера:

    Для 32-розрядних JVM, максимальний розмір купи за замовчуванням може становити до 1 ГБ, якщо фізична пам'ять становить 4 Гб або більше . Для 64-розрядних JVM, максимальний розмір купи за замовчуванням може становити до 32 ГБ, якщо фізична пам'ять становить 128 Гб або більше.

Які параметри конфігурації системи впливають на значення за замовчуванням?

Ви можете вказати початковий та максимальний розміри купи за допомогою прапорів -Xms (початковий розмір купи) та -Xmx (максимальний розмір купи). Якщо ви знаєте, скільки купівлі потрібно, щоб ваша програма працювала, ви можете встановити -Xms і -Xmx на одне значення


5

XmsІ Xmxє прапор віртуальної машини Java (JVM):

  • Xms: initial and minimumJVMheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • -server режим: 25% вільної фізичної пам'яті,> = 8 МБ і <= 64 МБ
      • -client mode: 25% вільної фізичної пам'яті,> = 8 МБ і <= 16 МБ
    • Typical Size:
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Function/ Effect:
      • -> JVM почати з виділення Xmsпам'яті розміру
  • Xmx: maximumJVMheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • <= R27.2
        • Windows: 75%від загальної фізичної пам'яті до1GB
        • Linux/Solaris: 50%доступної фізичної пам'яті до1GB
      • >= R27.3
        • Windows X64: 75%від загальної фізичної пам'яті до2GB
        • Linux/Solaris X64: 50%доступної фізичної пам'яті до2GB
        • Windows x86: 75%від загальної фізичної пам'яті до1GB
        • Linux/Solaris X86: 50%доступної фізичної пам'яті до1GB
    • Typical Size:
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Function/ Effect:
      • -> JVM дозволяють використовувати Xmxпам'ять максимального розміру
        • коли перевищить Xmx, будеjava.lang.OutOfMemoryError
          • Як виправити OutOfMemoryError?
            • перевищують Xmxзначення
              • наприклад: від -Xmx4gдо-Xmx8g

Більш детально

див. Офіційний документ: -X Параметри командного рядка


Хіба це не для JVockit JVM? (на відміну від Hotspot JVM Oracle)
вівторок

4

Ряд параметрів впливає на розмір генерації. Наступна схема ілюструє різницю між виділеним простором та віртуальним простором у купі. При ініціалізації віртуальної машини весь простір для купи зарезервовано. Розмір зарезервованого простору можна вказати за допомогою -Xmxпараметра. Якщо значення -Xmsпараметра менше, ніж значення -Xmxпараметра, не весь зарезервований простір негайно відводиться віртуальній машині. На цьому малюнку пропущений простір позначений "віртуальним". Різні частини купи (постійне покоління, старе покоління та молоде покоління) можуть зростати до межі віртуального простору у міру необхідності.

введіть тут опис зображення

За замовчуванням віртуальна машина зростає або скорочує купу кожної колекції, щоб спробувати зберегти частку вільного місця для живих об’єктів у кожній колекції в певному діапазоні. Цей цільовий діапазон встановлюється у відсотках за параметрами - XX:MinHeapFreeRatio=<minimum>і -XX:MaxHeapFreeRatio=<maximum>, а загальний розмір обмежений нижче -Xms<min>і вище на -Xmx<max>.

Параметр Значення за замовчуванням

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670k

-Xmx 64м

Значення параметрів розміру купи за замовчуванням у 64-розрядних системах були збільшені приблизно на 30%. Це збільшення має на меті компенсувати більший розмір об'єктів у 64-бітній системі.

За цих параметрів, якщо відсоток вільного простору в поколінні опуститься нижче 40%, генерація буде розширена, щоб підтримувати 40% вільного простору, до максимально допустимого розміру генерації. Аналогічно, якщо вільний простір перевищує 70%, генерація буде зайнята таким чином, що лише 70% місця буде вільним, за умови мінімального розміру генерації.

Великі серверні програми часто відчувають дві проблеми з тими за замовчуванням. Один - це повільний запуск, оскільки початкова купа невелика і її потрібно змінити в багатьох основних колекціях. Більш гострою проблемою є те, що максимальний розмір купи за замовчуванням невиправдано малий для більшості серверних програм. Основні правила для серверних додатків:

  • Якщо у вас проблеми з паузами, спробуйте надати віртуальну машину якомога більше пам’яті. Розмір за замовчуванням (64 Мб) часто занадто малий.
  • Встановлення -Xms і -Xmx на одне значення збільшує передбачуваність, видаляючи найважливіше рішення щодо розміру з віртуальної машини. Однак віртуальна машина потім не може компенсувати, якщо ви зробите поганий вибір.
  • Загалом, збільшуйте пам'ять у міру збільшення кількості процесорів, оскільки розподіл може бути паралельним.

    Є повна стаття

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.