ActiveMQ OutOfMemory Не может создать больше потоков
Вопрос
Я имитирую перегрузку сервера и получаю эту ошибку:
java.lang.OutOfMemoryError: unable to create new native thread
Я прочитал на этой странице http://activemq.apache.org/javalangoutofmemory.html, что я могу увеличить объем памяти.Но как мне это сделать?Какой файл мне нужно изменить?Я попытался передать аргументы с помощью скрипта bin / activemq, но безуспешно.
Решение
Ваш случай соответствует огромное количество потоков.Есть 3 способа решить эту проблему:
- уменьшите количество потоков (т. е., -Dorg.apache.activemq.Использовал dedicatedtaskrunner=false в документе)
- уменьшите размер стека для каждого потока на -Xss опция (значения по умолчанию:320 КБ для 32-разрядной Java в Win / Linux, 1024 КБ для 64-разрядной Java в Win / Linux, см. док)
- уменьшить (не расширять) размер кучи -Xmx возможность освободить место для стеков для каждого потока (по умолчанию в скрипте ActiveMQ 512 мбайт)
Примечание:Если стек или куча слишком малы, это должно привести к другому Ошибка OutOfMemoryError.
Вы можете указать их с помощью ACTIVEMQ_OPTS переменная оболочки (в UNIX).Например, запустите ActiveMQ как
ACTIVEMQ_OPTS=-Xss160k bin/activemq
Другие советы
Укажите аргумент -Xmx
для виртуальной машины, на которой работает ActiveMQ - например, Tomcat.
Вы можете назначить виртуальной машине Java больше памяти, используя аргумент команды -Xmx .
Например. java -Xmx512M MyClass
Мы столкнулись с этой проблемой в системе Linux (RedHat Enterprise 5) и обнаружили, что в этой сборке ulimit nprocs в /etc/security/limits.conf
фактически контролирует количество потоков в пользователь может порождать Р>
Вы можете просмотреть это ограничение с помощью команды ulimit -a
.
Из коробки было установлено мягкое ограничение в 100 и жесткое ограничение в 150, что крайне не хватает количества потоков, необходимых для запуска современного сервера приложений.
Мы полностью удалили этот лимит, и он решил эту проблему для нас.
Это не похоже на то, что вам не хватает места в куче, поэтому не увеличивайте его (опция -Xmx). Вместо этого вашему приложению не хватает памяти процесса, и уменьшение пространства кучи освободит память процесса для собственного использования. Вопрос в том, почему вы используете столько памяти процесса? Если вы не используете JNI, вы, вероятно, создали слишком много потоков, и пост Хабе объяснил, как это исправить.