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