У документації оракула я знайшов:
-Xmxsize Вказує максимальний розмір (у байтах) пулу розподілу пам'яті в байтах ... Значення за замовчуванням вибирається під час виконання на основі конфігурації системи.
Що означає конфігурація системи ?
У документації оракула я знайшов:
-Xmxsize Вказує максимальний розмір (у байтах) пулу розподілу пам'яті в байтах ... Значення за замовчуванням вибирається під час виконання на основі конфігурації системи.
Що означає конфігурація системи ?
-Xmx
, принаймні в Java 8, оскільки в моїй 64-бітовій системі Linux із загальною пам’яттю 6 Гб я маю jvm за замовчуванням -Xmx = 1,5 Гб.
Відповіді:
Це залежить від реалізації та версії, але зазвичай це залежить від використовуваної віртуальної машини (наприклад, клієнта або сервера, див. -client
І -server
параметри) та від вашої системної пам'яті.
Часто значенням за client
замовчуванням є 1/4 вашої фізичної пам’яті або 1 ГБ (залежно від того, що менше).
Також параметри конфігурації Java (параметри командного рядка) можуть бути "передані" на змінні середовища, включаючи -Xmx
, які можуть змінити значення за замовчуванням (тобто вказати нове значення за замовчуванням). Зокрема, JAVA_TOOL_OPTIONS
змінна середовища перевіряється усіма інструментами Java і використовується, якщо вона існує (докладніше тут і тут ).
Ви можете виконати таку команду, щоб побачити значення за замовчуванням:
java -XX:+PrintFlagsFinal -version
Це дає вам довгий список, -Xmx
є MaxHeapSize
, -Xms
є InitialHeapSize
. Відфільтруйте вихідні дані (наприклад, |grep
на Linux) або збережіть їх у файлі, щоб можна було шукати в ньому.
java -XX:+PrintCommandLineFlags
друк розмірів купи (та іншої інформації), вибраних JVM на основі поточної системної інформації
-XX:+PrintFlagsFinal
, який ви запропонували, для мене не працює. Додаючи його до відповіді.
-XX:+PrintFlagsFinal
це найкращий варіант, оскільки він повинен відображати всю інформацію після того, як все було враховано (включаючи параметри вручну та ергономіку). Хоча, -XX:+PrintCommandLineFlags
здається, працює на моєму JVM (може залежати від точної версії)
java -XX:+PrintFlagsFinal -version | grep HeapSize
Як ви вже згадували, значення за замовчуванням -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'
Ці значення за замовчуванням також можна замінити на бажану суму.
На диво, це питання не має остаточної документально підтвердженої відповіді. Можливо, інший пункт даних надав би користь іншим, хто шукає відповідь. У моїх системах під управлінням 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}
На моїй віртуальній машині Ubuntu із загальною 1048 Мб оперативної пам'яті java -XX:+PrintFlagsFinal -version | grep HeapSize
надруковано:, uintx MaxHeapSize := 266338304
що становить приблизно 266 Мб і становить 1/4 моєї загальної оперативної пам'яті.
Станом на 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, вище.