Для вычисления необходимого размера кучи (heap) мы воспользуемся опцией -XX:+PrintFlagsFinal
. В Java размер изначального (initial) и максимального (maximum) размера кучи (heap) выделяется по эргономическому алгоритму, дополнительно ссылки для java 7 и для java 8.
Если коротко то все это расчитывается по следующей формуле:
Изначальный размер кучи (initial heap size)
Соотношение 1⁄64 от количества физической памяти на 1GB
Максимальный разер кучи (maximum heap size)
Соотношение 1⁄4 от количества физической памяти на 1GB
К примеру рассмотрим вот такую машинку:
RAM: 6 GB
JDK: 1.7
Для отображения необходимой информации необходимо выполнить следующую команду:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Вот такой результат мы должны увидеть на экране:
Итого по полученным данным:
Изначальный размер кучи (initial heap size)
InitialHeapSize = 97801152 байт (97,8 Мб)
Максимальный разер кучи (maximum heap size)
MaxHeapSize = 1566572544 байт (1,5 Гб)
Выделенный размер кучи (heap memory size) довольно близок к результатам эргономики:
Изначальный размер кучи (initial heap size)
6144 Мб / 64 = 96 Мб
Максимальный разер кучи (maximum heap size)
6144 Мб / 4 = 1536 Гб
Для установки изначального размера кучи (initial heap size) используют -Xms
, а для максимального размера кучи (maximum heap size) используют -Xmx
.
Итого получаем команду для запуска:
$ java -Xms96m -Xmx1536m JavaApp
Как правило значения округляют в большую сторону, так что не бойтесь выделить немного больше и эксперементировать.
Источник: Find out your Java heap memory size