Я работаю над одной машиной с 512 ГБ оперативной памяти (обращаются к нескольким процессорам AMD Opteron 6212). В настоящее время оперативная память составляет около 300 ГБ. Запуск большого вычисления java, запустив
java path/to/myApp -Xms280g -Xmx280g > output.txt
должен немедленно сделать резерв Java 280 ГБ, и ошибка, если это не удастся. Как ни странно, ошибки не возникает, но top
показывает только использование памяти в 30,4 ГБ, но это не сбой. Как это может произойти? Разве java не должен сбой, если исходный размер кучи не может быть выделен?
И эффективно, я получаю OutOfMemory/Java heap space/GC overhead limit errors после того, как 30,4 ГБ заполнены, задолго до достижения 280 ГБ. Работа с 250 ГБ или 300 ГБ дает аналогичный предел 30,3 ГБ ~ 30,4 ГБ. Я запускаю 64-разрядную виртуальную машину OpenJDK с помощью среды OpenJDK Runtime Environment (IcedTea6) на Gentoo Linux, и есть много свободной памяти (более 300 ГБ).