За замовчуванням Xmxsize в Java 8 (максимальний розмір купи)


81

У документації оракула я знайшов:

-Xmxsize Вказує максимальний розмір (у байтах) пулу розподілу пам'яті в байтах ... Значення за замовчуванням вибирається під час виконання на основі конфігурації системи.

Що означає конфігурація системи ?


1
Це означає, що якщо у вашій системі 16 ГБ оперативної пам'яті, розмір буде більшим, ніж у випадку, якщо вона має 512 МБ.
JB Nizet

Дякую, на скільки більше?
Віталій

Подивіться на «максимальний розмір купи» тут
Нір Альфас

3
>> Менше 1/4 фізичної пам'яті або 1 Гб. Дякую, @alfasin.
Віталій

4
@Vitaly Обмеження 1 Гб, схоже, не виконується -Xmx, принаймні в Java 8, оскільки в моїй 64-бітовій системі Linux із загальною пам’яттю 6 Гб я маю jvm за замовчуванням -Xmx = 1,5 Гб.
Трамп 2020 - Справедливість настане

Відповіді:


144

Це залежить від реалізації та версії, але зазвичай це залежить від використовуваної віртуальної машини (наприклад, клієнта або сервера, див. -clientІ -serverпараметри) та від вашої системної пам'яті.

Часто значенням за clientзамовчуванням є 1/4 вашої фізичної пам’яті або 1 ГБ (залежно від того, що менше).

Також параметри конфігурації Java (параметри командного рядка) можуть бути "передані" на змінні середовища, включаючи -Xmx, які можуть змінити значення за замовчуванням (тобто вказати нове значення за замовчуванням). Зокрема, JAVA_TOOL_OPTIONSзмінна середовища перевіряється усіма інструментами Java і використовується, якщо вона існує (докладніше тут і тут ).

Ви можете виконати таку команду, щоб побачити значення за замовчуванням:

java -XX:+PrintFlagsFinal -version

Це дає вам довгий список, -Xmxє MaxHeapSize, -Xmsє InitialHeapSize. Відфільтруйте вихідні дані (наприклад, |grepна Linux) або збережіть їх у файлі, щоб можна було шукати в ньому.


11
Як невелике доповнення, ви можете запустити java -XX:+PrintCommandLineFlagsдрук розмірів купи (та іншої інформації), вибраних JVM на основі поточної системної інформації
Крістіан Ват, 02

1
@CristianVat Так, але параметр такий -XX:+PrintFlagsFinal, який ви запропонували, для мене не працює. Додаючи його до відповіді.
icza

Правильно, вибачте, -XX:+PrintFlagsFinalце найкращий варіант, оскільки він повинен відображати всю інформацію після того, як все було враховано (включаючи параметри вручну та ергономіку). Хоча, -XX:+PrintCommandLineFlagsздається, працює на моєму JVM (може залежати від точної версії)
Крістіан Ват 02

2
Для великих коробок цього основного правила "1/4 RAM" точно не виконується. На 4-сокетному, 64 Гб на сервер сокет (тобто 256 Гб оперативної пам'яті), Xmx за замовчуванням становить ~ 32 Гб. 32 Гб може бути пов’язано з обмеженнями CompressedOops, які знаходяться приблизно на цьому етапі.
FauxFaux

2
Це лише рядки, пов’язані з розміром відбитка:java -XX:+PrintFlagsFinal -version | grep HeapSize
Трамп 2020 - Справедливість настане

37

Як ви вже згадували, значення за замовчуванням -Xmxsize(Maximum HeapSize) залежить від конфігурації вашої системи.

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

Це означає, що якщо у вас є фізична пам’ять 8 ГБ оперативної пам’яті, ви матимете Xmssizeяк більше 8 * (1/6), так і меншу, -Xmxsizeяк 8 * (1/4).

Ви можете перевірити свій HeapSize за замовчуванням

У Windows :

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

У Linux :

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

Ці значення за замовчуванням також можна замінити на бажану суму.



docs.oracle.com/javase/8/docs/technotes/guides/vm/… згідно з цим посиланням, за замовчуванням для мінімального / початкового значення є 1/64, а не 1/6. "Більше
1/64

15

На диво, це питання не має остаточної документально підтвердженої відповіді. Можливо, інший пункт даних надав би користь іншим, хто шукає відповідь. У моїх системах під управлінням CentOS (6.8,7.3) та Java 8 (збірка 1.8.0_60-b27, 64-бітний сервер):

за замовчуванням пам’ять становить 1/4 фізичної пам’яті, не обмежується 1 Гб.

Крім того, -XX:+PrintFlagsFinalдрук у STDERR, тому команду для визначення поточної пам'яті за замовчуванням, представлену іншими вище, слід налаштувати таким чином:

java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize

У системі з 64 ГБ фізичної оперативної пам'яті повертається:

uintx MaxHeapSize                                  := 16873684992      {product}

У моїй системі з 16 Гб оперативної пам'яті: 2069889024 = 2 Гб.
david.perez

Windows 7 64-бітна з 8 ГБ оперативної пам'яті: 32-бітні JVM: 256 МБ, 64-бітні JVM: 2 ГБ
golimar

Нарешті знайшов в документації до нього: stackoverflow.com/a/56036202/32453
rogerdpack

2

На моїй віртуальній машині Ubuntu із загальною 1048 Мб оперативної пам'яті java -XX:+PrintFlagsFinal -version | grep HeapSizeнадруковано:, uintx MaxHeapSize := 266338304що становить приблизно 266 Мб і становить 1/4 моєї загальної оперативної пам'яті.


2
Мені здається, що OpenJDK і Oracle мають різні характеристики - я бачу, що OpenJDK постійно використовує 1/4 оперативної пам'яті як -Xmx (ніколи не менше 1/4 та 1 Гб)
погул

1

Станом на 8 травня 2019 року:

Розмір купи JVM залежить від конфігурації системи, тобто:

а) jvm клієнта проти jvm сервера

б) 32 біт проти 64 біт .

Посилання:

1) оновлення з J2SE5.0: https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) коротка відповідь: https://docs.oracle.com/ javase / 8 / docs / technotes / guides / vm / gctuning / ergonomics.html
3) детальна відповідь: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html# default_heap_size
4) клієнт проти сервера: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

Короткий зміст: (Це важко зрозуміти з наведених посилань. Тому узагальнюючи їх тут)

1) Максимальний розмір купи за замовчуванням для jvm клієнта становить 256 Мб (є виняток, прочитайте з посилань вище).

2) За замовчуванням максимальний розмір купи для jvm сервера 32 біт становить 1 Гб, а 64 біт - 32 Гб (знову ж тут є винятки. Будь ласка, прочитайте це за посиланнями).

Тож за замовчуванням максимальний розмір купи jvm становить: 256mb або 1gb або 32gb, залежно від VM, вище.


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