Збільшення максимального розміру купи JVM для додатків із великою пам’яттю


88

Мені потрібно запустити додаток із інтенсивною пам'яттю Java, який використовує більше 2 Гб, але у мене виникають проблеми зі збільшенням максимального розміру купи. Поки що я спробував такі підходи:

  • Встановлення параметра -Xmx, наприклад -Xmx3000m. Цей підхід не вдається створити JVM. З того, що я погуглив, схоже, що -Xmx має бути менше 2 Гб.

  • Використання опції -XX: + AggressiveHeap . Коли я спробую цей підхід, я отримую помилку "Недостатньо пам'яті", яка повідомляє, що розмір купи становить 1273,4 МБ, навіть незважаючи на те, що мій комп'ютер має 8 Гб пам'яті.

Чи є інший підхід, за допомогою якого я можу спробувати збільшити максимальний розмір купи JVM? Ось короткий опис технічних характеристик комп’ютера:

  • ОС: Windows 7 (64 біт)
  • Процесор: Intel Core i7 (2,66 ГГц)
  • Пам'ять: 8 ГБ
  • java -версія:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

7
До речі: мінімальний та максимальний обсяг пам'яті тепер є стандартними опціями. Ви можете використовувати -ms та -mx замість -Xms та -Xmx. -X ?? зарезервовано для нестандартних опцій.
Пітер Лорі

2
Стандарт для якого JVM? Вони все ще нестандартні для HotSpot JVM (станом на 1.8). Див docs.oracle.com/javase/8/docs/technotes/tools/unix / ...
клубової

-mx та -ms існує і працює, але я не можу знайти його в офіційній документації Java @PeterLawrey> Ви можете додати посилання на документацію? Подяка
Michal Bernhard

2
@MichalBernhard - це зворотна сумісність з Java 1.1. Я бачив, як це задокументовано для цієї версії, але зараз важко знайти. ;)
Пітер Лорі

1
Дякую @PeterLawrey за пояснення. Але коли ви говорите, що це тепер стандарт, ви маєте на увазі, що це стандарт з Java 1.1 (але не документ у пізніших версіях)? Здається дивним :) btw Я знайшов посилання на документацію до Java 1.1, і ви маєте рацію: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
Міхал Бернхард

Відповіді:



96

Коли ви використовуєте JVM у 32-розрядному режимі, максимальний розмір купи, який можна виділити, становить 1280 МБ. Отже, якщо ви хочете вийти за межі цього, вам потрібно запустити JVM у 64-режимі.

Ви можете використовувати наступне:

$ java -d64 -Xms512m -Xmx4g HelloWorld

де,

  • -d64: Увімкне 64-розрядну JVM
  • -Xms512m: встановить початковий розмір купи 512 МБ
  • -Xmx4g: встановить максимальний розмір купи 4 Гб

Ви можете налаштувати -Xms та -Xmx відповідно до ваших вимог (YMMV)

Дуже хороший ресурс з налаштування продуктивності JVM, до якого, можливо, варто довідатися : http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


Моя JVM є 32-розрядною і дозволяє максимум -Xmx1024M. Також збираюся спробувати 64-бітну версію.
kiltek

Я спробував 64-розрядну версію JVM, і вона працювала чудово. Тепер я можу встановити 4096 МБ максимального розміру купи. Коли ви встановили як 32, так і 64 біти, принаймні в Windows вам потрібно вказати шлях Java для своїх програм до нової встановленої 64-бітної версії. В іншому випадку помилка не зникне. У Windows це часто можна зробити, змінивши шлях Java у системних змінних середовища.
Фабіано

Я припускаю, що обмеження для максимальної кількості не 1280, а щось близько 1700 МБ. Я використав максимум 1600 МБ для моєї 32-розрядної інсталяції JVM, і вона працювала нормально.
Фабіано

який аргумент HelloWorld у вашій команді? як я можу використовувати цю команду, якщо я хочу встановити максимум процесу Java, який запускається за допомогою команди java -jar myApp.jar у Linux?
LordScone

Привіт, я можу запитати, який максимальний розмір купи Java можна встановити? Коли я запускаю програму, за замовчуванням -Xmx на моїй машині дорівнює 4 Гб, але чи можу я встановити її більше 4 Гб?
Ок,

14

Я вважаю, що 2 Гб обмежено для 32-розрядної Java. Я думав, що v1.6 завжди 64-бітний, але спробуйте примусити 64-бітний режим, щоб побачити: додайте опцію -d64.


Параметр -D64 не спрацював, я спробую використовувати 64-розрядну JVM, як запропонував GregS, і повідомити про результати.
Alceu Costa

1
Перемикачі -d64 та -d32 коректно працюють лише на Solaris (принаймні відповідно до цієї документації): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Лукаш Стельмах

Я спробував обидва варіанти. З -d64 JVM не запускається, навіть якщо я не вказав параметр Xmx. -D64 працює лише тоді, коли я не вказую Xmx.
Alceu Costa,

@Lukasz -d64 та -d32 також, здається, працюють на JVM від Apple. Але, здається, з цього документа випливає, що вони не функціонують для JVM від Windows та Linux.
G__

8

32-розрядна Java обмежується приблизно від 1,4 до 1,6 ГБ.

Поширені запитання щодо 32-розрядної купи Oracle

Цитата

Максимальний теоретичний ліміт кучі для 32-бітної JVM становить 4G. Через різні додаткові обмеження, такі як доступний обмін, використання адресного простору ядра, фрагментація пам'яті та накладні витрати на ВМ, на практиці межа може бути набагато нижчою. У більшості сучасних 32-розрядних систем Windows максимальний розмір купи становить від 1,4 до 1,6 г. На 32-розрядних ядрах Solaris адресний простір обмежений 2G. У 64-розрядних операційних системах з 32-розрядною віртуальною машиною максимальний розмір купи може бути вищим, наближаючись до 4G у багатьох системах Solaris.


4

Нижче conf працює для мене:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.