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