В системе достаточно памяти, но «Не удалось зарезервировать достаточно места для кучи объектов» - PullRequest
1 голос
/ 10 января 2012

Я пытаюсь запустить процесс Java, который требует много памяти.По некоторым причинам, это не работает, если я указываю больше 19 ГБ ОЗУ для процесса.Свободный и верхний показывает, что у меня есть 23 ГБ свободной памяти, поэтому мне интересно, почему возникает эта ошибка.

           total       used       free     shared    buffers     cached
Mem:         24158       1047      23111          0         16        356
-/+ buffers/cache:        673      23485
Swap:         2204          0       2204

Запуск процесса с этими параметрами jvm:

-XX:+UseConcMarkSweepGC -server -d64 -Xms4g -Xmx22g

версия:

java version "1.7.0_02"
Java(TM) SE Runtime Environment (build 1.7.0_02-b13)
Java HotSpot(TM) 64-Bit Server VM (build 22.0-b10, mixed mode)

Однако, если я укажу 19G в качестве Xmx, он будет работать.

Ответы [ 3 ]

1 голос
/ 10 января 2012

Java VM выделяет память как для кучи, так и для пространства PermGen. Может быть, ваша конфигурация с пространством кучи + пространством PermGen превышает вашу свободную память?

Какое значение -XX:MaxPermSize установлено в?

0 голосов
/ 10 января 2012

да, вы столкнулись с проблемой разметки памяти, потому что выполняете приблизительные вычисления: размер процесса (как видно на вашей машине Unix) = размер обнаженного процесса + размер кучи + размер perm gen + размер стека

стек довольно маленький (х Мб) размер процесса (у Мб) размер кучи = то, что вы хотите perm gen может зависеть от разных параметров, но упаковка имеет значение (особенно в приложениях Spring)

Не забудьте оставить достаточно памяти на вашей машине Unix (остановить все неиспользуемые сервисы), чтобы избежать подкачки, которая не очень вам поможет в работе

НТН Джером

0 голосов
/ 10 января 2012

Извлечено из документов Java:

" Как правило, для любой платформы вы не хотите использовать параметр максимального размера кучи, больший, чем 75% доступной физической памяти. Это потому, что вам нужночтобы оставить некоторое пространство памяти доступным для внутреннего использования в JVM".

, также звучит так, как будто вы должны пересмотреть все, что делает этот процесс, если ему требуется до 22 ГБ оперативной памяти

...