Ограничение размера кучи JVM от Sun в 64-битной Ubuntu - PullRequest
3 голосов
/ 17 августа 2011

Я вижу странное поведение при максимальном размере кучи, который я получаю в 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 сообщит о максимальном размере кучи 1820M на JVM от Sun и 3072M (как и ожидалось) на JRockit.

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

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

EDIT:

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

EDIT2:

Я написал следующий простой код для проверки этого поведения:

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 и т. Д. ... для множества различных значений, как в JVM Sun, так и в JRockit. Sun всегда будет сообщать о странном значении для maxMemory() и будет расти на больших шагах (например, 30M) между пробегами. JRockit каждый раз сообщает точное значение.

1 Ответ

0 голосов
/ 17 августа 2011

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

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

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

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

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

...