У меня есть сервер под управлением Solaris 10. Он сообщает о 70+ ГиБ свободной оперативной памяти. Я пытаюсь запустить Tomcat 7.0.68, используя Java 1.7.0_80 в 64-битном режиме.
Сервер утверждает, что не может выделить 717 МБ ОЗУ. При каждой попытке я получаю файл hs_err_pidxxx.log. Это предполагает следующее:
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 717225984 bytes for committing reserved memory.
# Possible reasons:
# The system is out of physical RAM or swap space
Нет. Доступно 70 ГиБ, он пытается выделить 700 МиБ.
# In 32 bit mode, the process size limit was hit
Мы в 64-битном режиме.
# Possible solutions:
# Reduce memory load on the system
На этой машине нет ничего, кроме ОС.
# Increase physical memory or swap space
У нас уже на два порядка больше, чем нужно.
# Check if swap backing store is full
Нет.
# Use 64 bit Java on a 64 bit OS
Готово.
# Decrease Java heap size (-Xmx/-Xms)
Был бы, если бы мог.
# Decrease number of Java threads
Как это сделать?
# Decrease Java thread stack sizes (-Xss)
Предлагаемые значения? Он установлен по умолчанию, но я не знаю, как его настроить.
# Set larger code cache with -XX:ReservedCodeCacheSize=
Опять же, мы по умолчанию.
$ swap -s
total: 48607296k bytes allocated + 18201336k reserved = 66808632k used, 311770552k available
Свободная оперативная память просто означает, что в ней ничего не хранится. Это не значит, что вы можете его использовать. Вполне возможно, что ОЗУ, о котором сообщается, что свободна, не будет использоваться вашей новой JVM, потому что другие приложения зарезервировали ее. В любом случае, JVM, как и большинство приложений, требует не RAM, а виртуальную память. Скорее всего, это проблема вашей системы - нехватка виртуальной памяти.
Вы узнаете об использовании виртуальной памяти с помощью этой команды:
swap -s
Простой ответ на нехватку виртуальной памяти - просто увеличить (или создать) область подкачки для резервирования памяти, чтобы иметь область резервного хранилища.
Изменить: с дополнительной информацией, которую вы опубликовали, причина, по которой ваше приложение не может выделить больше виртуальной памяти, связана с тем, что вы работаете в неглобальной зоне, где установлено ограничение памяти. Неглобальные зоны - это контейнеры, то есть все они используют одно и то же ядро. Однако их использование ресурсов может быть ограничено, чтобы одна зона не мешала другим.
Помимо остановки других процессов, использующих виртуальную память, вы ничего не можете сделать из этой зоны, даже будучи пользователем root. Вам необходимо попросить администратора глобальной зоны предоставить больше виртуальной памяти вашей зоне, в вашем случае zone.max-swap
настройка.