У меня есть сервер под управлением 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, как и большинство приложений, запрашивает не оперативную память, а виртуальную. Это более чем вероятно, что проблема вашей системы страдает, отсутствие виртуальной памяти.
Вы будете знать использование виртуальной памяти с помощью этой команды:
swap -s
Простой ответ на нехватку виртуальной памяти просто увеличить (или создать) область подкачки для резервирования памяти, чтобы иметь подкрепление области хранения.
Правка: С дополнительной информацией, которую вы разместили, причина, по которой ваше приложение не может выделить больше виртуальной памяти из-за того, что вы работаете в не глобальной зоне, где закрытие памяти находится на месте. Не глобальная зона - это контейнеры, т.е. все они используют одно и то же ядро. Однако, их использование ресурсов может быть ограничено, чтобы одна зона не мешала другим.
Помимо остановки других процессов, использующих виртуальную память, вы ничего не можете сделать из этой зоны, даже в качестве корня. Вам нужно попросить администратора глобальной зоны предоставить больше виртуальной памяти для вашей зоны , в вашем случае настройка zone.max-swap
.