Java “Не мог зарезервировать достаточно пространства для объектной "кучи"” даже при том, что существует достаточно RAM

Никакой GUI, старая машина? NetBSD был бы моим выбором (хотя установка является болью, если Вы не привыкли к установке всего сами). Вообще-то, если задуматься FreeBSD 9.0 намного легче настроить и поддерживать, будет легче найти. Это не использует слишком много памяти, и Ваша дуга, вероятно, поддерживается.

8
27.04.2016, 21:12
4 ответа

OpenVZ & Memory

failcnt повышается на privvmpages, таким образом, Ваш контейнер не может выделить больше пространство виртуальной памяти от хоста:

root@server: ~ # cat /proc/user_beancounters
Version: 2.5
       uid  resource                     held              maxheld              barrier                limit              failcnt
            privvmpages               6005601              6291447              6291456              6291456                 >233<
            physpages                 4635460              6291456              6291456              6291456                    0
            vmguarpages                     0                    0              6291456  9223372036854775807                    0
            oomguarpages              1529376              2144671              6291456  9223372036854775807                    0

Отметьте ту виртуальную память! = физическая память. Процессы могут выделить до где-нибудь вокруг адресуемого объема виртуальной памяти (32 бита ~ 2G - 4G, 64 бита 8 ТБ - 256 ТБ), но это не означает, что страницы физической памяти используются (страница, являющаяся блоком 4 КБ памяти).

physpages количество страниц физической памяти, которые может использовать Ваш контейнер.
oomguarpages гарантируемые страницы памяти, которые получит контейнер, когда хост будет ограниченной памятью.
privvmpages количество страниц виртуальной памяти, которые может использовать Ваш контейнер
vmguarpages гарантируемый объем виртуальной памяти таким же образом

Java

Java Oracle будет всегда выделять один непрерывный блок виртуальной памяти. Выполнение java без аргументов на поле приводит к 5M используемой реальной памяти (RSS), но 660M выделенного места VM (VSZ):

  PID COMMAND                        VSZ   RSS
20816 java                        667496  4912 

Рассмотрение сегментов памяти для java процесс в он smaps файл показывает блок выделенных приблизительно 500 МБ, остальное - файлы с отображенной памятью и нормальный материал Java.

В системе это произошло некоторое время, доступное пространство VM становится фрагментированным, поскольку процессы используют/освобождают части его. A grep Vmalloc /proc/meminfo даст Вам VmallocChunk который является самым большим свободным в настоящее время доступным блоком. Если это будет низко, то система попытается выделить больше когда java запросы это, в конце концов, это фактически неограниченно на поле на 64 бита.

Зафиксировать

Скажите Вашему хосту настраивать privvmpages и vmguarpages намного выше. Нет никакой потребности в них совпасть с физической памятью, поскольку это влияет на способ, которым работает память Linux

Вы смогли работать вокруг проблемы временно путем отбрасывания кэша файла echo 1 > /proc/sys/vm/drop_caches но это является только временным.

Можно ограничить блок памяти java попытки выделить во время выполнения с минимумом Xms или при выполнении с максимумом Xmx. Выполнение java с этими опциями на моей машине:

java -Xms10M -Xmx10M

уменьшает общий виртуальный размер приблизительно до 140 МБ только с 10 МБ непрерывный блок для выделенной "кучи" Java.

10
27.01.2020, 20:08
  • 1
    Спасибо за Ваш ответ. Я на 100% уверен, что мой hoster не собирается изменять что-либо о контейнере. Я также не могу отбросить свой кэш, потому что мой контейнер находится на OpenVZ. (Кроме того, grep Vmalloc /proc/meminfo не дает вывода), Выполнение java -Xms10M -Xmx10M работы все же. Но это действительно не решает все проблемы. Как запуск дополнительных программ с Использованием оперативной памяти чего-то приблизительно 2 ГБ... –  BrainStone 19.01.2014, 18:46
  • 2
    Почему Вы используете их, если бы Вы не думаете, что их поддержка не помогла бы Вам с проблемой конфигурации? Возможно, расположите примеры конфигурации и таблицы? Это не стоит им ничего для выделения дополнительных неприменимых страниц памяти. –  Matt 19.01.2014, 20:55
  • 3
    я использую их, потому что качество достаточно и цена, является низким. Второй существует ли способ сказать Java, что не должен использовать непрерывные блоки памяти? –  BrainStone 19.01.2014, 23:38
  • 4
    @BrainStone Вы выполняете JVM на 64 бита. Ограничение фрагментации должно только влиять на приложения на 32 бита на ОС на 32 бита. –  jlliagre 21.01.2014, 00:11
  • 5
    @jlliagre openvz помещает искусственный предел на пространство VM. А-ч –  Matt 21.01.2014, 21:07

Вероятно, необходимо изменить размер "кучи" Java по умолчанию, испытать эти аргументы:

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

например:

java -Xms64m -Xmx1512m

Этот поток мог быть полезным

Также проверьте ulimit (ulimit, обеспечивает управление ресурсами, доступными оболочке и процессам, запущенным им):

ulimit -a 
3
27.01.2020, 20:08
  • 1
    я уже использую аргументы размера "кучи" (при запущении приложений). И мой ulimit -a кажется нормальным. Большинство значений включая virtual memory неограниченны. Те, которые казались немного низким, я удвоился (-s от 8 192 до 16 384 и -l от 64 до 128) для тестирования, но это не помогло также. –  BrainStone 18.01.2014, 01:14
  • 2
    И что относительно размера адресного пространства для процесса (-A)? Еще одна вещь, похоже, что у Вас нет области подкачки вообще. Это действительно не хорошо, как подкачка также добавляет к Вашему размеру виртуальной памяти. Java попытается выделить память в большом блоке, таким образом, ОС могла бы попытаться перераспределить некоторую неиспользованную память для свопинга. Попытайтесь добавить 32 ГБ подкачки. –  b13n1u 18.01.2014, 01:50
  • 3
    Существует нет -A опция для меня. И мне не разрешают добавить Подкачку. –  BrainStone 19.01.2014, 18:40

Вы могли бы просто быть вне виртуальной памяти.

Вы фокусируетесь на Использовании оперативной памяти (или отсутствие), но Ваши существующие JVMs резервируют виртуальную память, не RAM. Пока к зарезервированным страницам памяти не получают доступ, нет никакого Использования оперативной памяти, о котором сообщают для них.

В то время как Linux обычно маскирует этот выпуск своими настройками чрезмерных обязательств, довольно возможно, что факт, который Вы выполняете на уровне ОС, виртуализировал, среда или уменьшает/запрещает по обязательству или установила ограничение управления ресурсами виртуальной памяти.

На регулярном экземпляре ОС (не контейнер), самый легкий путь к обходному решению это должно добавить некоторую подкачку, которая позволит зарезервированной памяти не тратить впустую RAM. На контейнере способ преодолеть проблему мог бы также потребовать увеличения глобально доступной виртуальной памяти, но в более общем плане просто сделан путем предоставления большей виртуальной памяти контейнеру.

2
27.01.2020, 20:08

В нашем случае это помогло ограничить размер кучи, которую виртуальная машина пытается зарезервировать при запуске.

Например, в командной строке:

export _JAVA_OPTIONS = '- Xms64M -Xmx128m'

или для Tomcat в [TOMCAT_HOME] /bin/setenv.sh

#! / Bin / sh

JAVA_OPTS = "- Xms64M -Xmx256M"

(Обратите внимание на дополнительное подчеркивание в начале командной строки.)

Объяснение нашего провайдера:

  • виртуальная машина Java вычисляет начальный размер кучи при запуске
  • это расчет основан на доступной оперативной памяти.
  • Некоторые установки Java на виртуальных частных серверах (VPS) не могут отражать ограничения памяти VPS при вычислении начального размера кучи. Вместо этого они основывают свои расчеты на размере памяти хостинговой системы. Это может привести к тому, что объем свободной памяти будет недоступен на VPS.
  • при предоставлении начального размера кучи через JAVA_OPTS виртуальная машина использует эти значения и не пытается вычислить самостоятельно.
7
27.01.2020, 20:08

Теги

Похожие вопросы