Увеличение максимального размера кучи 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. -ИКС?? зарезервировано для нестандартных опций.
Питер Лоури

2
Стандарт для какой JVM? Они все еще нестандартны для JVM HotSpot (начиная с версии 1.8). См. Docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle

-mx и -ms существуют и работают, но я не могу найти их в официальной документации java @PeterLawrey> вы можете добавить ссылку на документацию? Спасибо
Michal Bernhard

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

1
Спасибо @PeterLawrey за объяснение. Но когда вы говорите, что теперь это стандарт, вы имеете в виду, что он стандартен для Java 1.1 (но не документирован в более поздних версиях)? Кажется странным :) Кстати, я нашел ссылку на документацию по 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 ГБ?
Ock

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 Sun для Windows и Linux.
G__

8

32-разрядная версия Java ограничена размером примерно от 1,4 до 1,6 ГБ.

32-битная куча Oracle: часто задаваемые вопросы

Цитата

Максимальный теоретический предел кучи для 32-разрядной JVM составляет 4G. Из-за различных дополнительных ограничений, таких как доступный своп, использование адресного пространства ядра, фрагментация памяти и накладные расходы виртуальной машины, на практике предел может быть намного ниже. В большинстве современных 32-разрядных систем Windows максимальный размер кучи составляет от 1,4 ГБ до 1,6 ГБ. В 32-разрядных ядрах Solaris адресное пространство ограничено 2 ГБ. В 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.