Ограничение размера кучи Sun JVM в 64-разрядной версии Ubuntu

Я вижу какое-то странное поведение при максимальном размере кучи, который я получаю на JVM Sun, по сравнению с JRockit.

Я запускаю IDEA на 64-битных виртуальных машинах в 64-битной системе (Ubuntu 11.04). Я тестирую следующие версии JVM: Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) (которую я получил с apt-get install sun-java6-jdk, и Oracle JRockit(R) (build R28.1.3-11-141760-1.6.0_24-20110301-1432-linux-x86_64, compiled mode) (которую я скачал с сайта Oracle пару месяцев назад).

Если я передам параметры -Xms1g -Xmx3g, IDEA сообщит о максимальном размере кучи 1820 МБ на JVM Sun и 3072 МБ (как и ожидалось) на JRockit.

Если я передам -Xms2g -Xmx4g, IDEA сообщит о 3640M на Sun и 4096M на JRockit.

Что случилось? Что это за мистические числа 1820M и 3640M = 2*1820M? Разве нельзя запустить JVM Sun с нужным мне размером кучи?

РЕДАКТИРОВАТЬ:

Ответ был удален, поэтому просто верните мои комментарии: обратите внимание, что я говорю о МАКСИМАЛЬНОМ размере, а не о текущем размере. Учтите, что я много исследовал, прежде чем задать вопрос здесь, поэтому нет необходимости учить значение Xms, Xmx или любого другого параметра, определяющего размер областей памяти (их можно найти в другом месте) .

РЕДАКТИРОВАТЬ2:

Я написал следующий простой код, чтобы проверить это поведение:

public static void main(String[] args) throws Exception {
  while (true) {
    final Runtime r = Runtime.getRuntime();
    System.out.println("r.freeMemory() = " + r.freeMemory()/1024.0/1024);
    System.out.println("r.totalMemory() = " + r.totalMemory()/1024.0/1024);
    System.out.println("r.maxMemory() = " + r.maxMemory()/1024.0/1024);
    Thread.sleep(1000);
  }
}

Затем я запустил его с параметрами -Xmx100m, -Xmx110m, -Xmx120m и т. д. для множества разных значений, как на Sun JVM, так и на JRockit. Sun всегда будет сообщать странное значение для maxMemory() и будет расти большими шагами (например, 30M) между запусками. JRockit каждый раз сообщал точное значение.


person Bruno Reis    schedule 17.08.2011    source источник
comment
Кстати, какую версию JVM вы используете? Просто интересуюсь.   -  person Petriborg    schedule 17.08.2011
comment
Добавлено к вопросу, так как это может быть очень важная информация, которую я забыл дать!   -  person Bruno Reis    schedule 17.08.2011


Ответы (1)


Xms и Xmx служат только для указания минимального и максимального размера выделенной кучи. Фактический размер выделенной кучи может/будет находиться между минимальным и максимальным значением, поскольку JVM может изменять размер кучи, особенно во время событий выделения объектов или событий сборки мусора.

Если вам нужно, чтобы JVM использовала «точный» размер кучи, вы можете указать значения Xms и Xmx, которые достаточно близки друг к другу, чтобы не происходило изменение размера кучи. Конечно, эти значения должны соответствовать непрерывному объему свободной памяти.

В приведенном выше разделе предполагалось нечто иное, и его можно игнорировать в практических целях.

На основе кода, используемого для расчета размера кучи, следует отметить, что Runtime.maxMemory() возвращает значение, не соответствующее значению, переданному во флаге Xmx для Hotspot JVM; в документации расплывчато указано, что она просто вернет значение, указывающее память, доступную для JVM для использования.

Судя по поведению вашего опубликованного кода, изменение размера кучи приведет к тому, что для разных вызовов Runtime.maxMemory() будут сообщаться разные значения. Кроме того, было бы излишним указывать, что JVM JRockit сообщает о значении, переданном через флаг Xmx.

person Vineet Reynolds    schedule 17.08.2011
comment
может вы невнимательно прочитали мой вопрос, или я не правильно выразился. Я не говорю об использовании кучи, не являющейся указанными точными значениями. Я говорю, что максимальная доступная куча, о которой сообщает JVM, не является значением, которое я указал в случае JVM Sun. Это правильное значение для JRockit. Очевидно, что фактическое использование кучи будет меняться во времени и будет находиться в диапазоне от Xms до Xmx. Я говорю о том, что Sun не распознает правильное значение для Xmx и вместо этого использует кратное 1820. - person Bruno Reis; 17.08.2011
comment
Как вы получаете максимальный размер кучи? Я полагаю, что IDEA сообщает текущий, а не максимальный размер кучи. - person Vineet Reynolds; 17.08.2011
comment
Нет, Винит. IDEA сообщает как текущий, так и максимальный размер кучи. Я говорю о максимальном размере кучи. Текущий выглядит правильно для меня (продолжает расти, расти, а затем сжиматься при сборке мусора). Учтите, что я много исследовал, прежде чем задать вопрос здесь. - person Bruno Reis; 17.08.2011
comment
Означает ли это, что Sun фактически игнорирует параметр Xmx? - person Bruno Reis; 17.08.2011
comment
Нет, это означает, что вы не должны использовать Runtime.maxMemory для чтения значения Xmx. Это две разные вещи для HotSpot. - person Vineet Reynolds; 17.08.2011