Сколько памяти занимает поток Tomcat? - PullRequest
4 голосов
/ 19 января 2012

Если я увеличу пул потоков Tomcat с N до N + 1 потоков, сколько дополнительной памяти это займет?

Конечно, мое приложение может отвечать за дополнительную память, но давайте проигнорируем это,Мне просто интересно, сколько Tomcat берет.

Думаю, я мог бы провести несколько тестов и измерить его сам, но я надеюсь, что кто-то уже сделал это и может поделиться или указать на результаты.

Ответы [ 3 ]

3 голосов
/ 20 января 2012

Потребляемая дополнительная физическая память будет фактически вообще отсутствовать.До тех пор, пока поток не заработает, операционная система не будет тратить физическую память, хранящую свой стек или связанные структуры.(Конечно, он, вероятно, будет потреблять некоторую физическую память, потому что он создаст начальный стек. Но это можно и будет выгружать без ущерба для производительности, если поток не работает.)

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

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

Конечно, 32-разрядный процесс принципиальноограничено 2 ГБ, 3 ГБ или 4 ГБ виртуальной памяти (в зависимости от платформы).Таким образом, у вас может не быть иного выбора, кроме как уменьшить максимальный размер стека потоков.(Поток немедленно потребляет виртуальную память, равную его максимальному размеру стека, поскольку адресное пространство должно быть зарезервировано, даже если оно никогда не используется.)

Также возможно уменьшение максимального размера стека потока.Это компромисс, хотя.Больший максимум предотвращает возникновение исключения для потока, если ему требуется много стека в течение всего срока его службы.И единственным потребляемым ресурсом является адресное пространство, которое обычно дешево.Но единственное практическое ограничение, которое вы можете наложить на программу, чтобы не допустить ее нехватки физической памяти и плохой работы, - это ограничение виртуальной памяти.Так что ручка, которую вы действительно хотите, не существует.

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

Я полагаю, что основным использованием памяти будет пространство стека, выделенное для каждого потока. Это контролируется в командной строке через -Xss

0 голосов
/ 11 июня 2019

Исходя из того, что я видел, один новый поток ожидания займет около 20 КБ - 50 КБ памяти .

Оттуда он может расти по мере выполнения в зависимости от глубины стека (вызовы вложенных методов) и количества параметров и локальных переменных (все примитивы и указатели в параметрах метода и локальных переменных добавляются в стек.Принимая во внимание, что сами объекты помещаются в кучу).

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

Короче говоря: Будет добавлен дополнительный поток оИспользование памяти в размере 0,05 МБ.

Примечание 1. Кажется, что для каждого потока существует ограничение на количество потоков.Таким образом, реализация linux может позволить одной JVM создать до 1000 или 2000 потоков.

Итак, вы должны убедиться, что все пулы потоков в вашем приложении содержат менее 2000 потоков.В противном случае JVM может внезапно завершить работу при нарушении этого предела.

Примечание 2. NMT JVM ошибочно сообщает о выделенной памяти Java 8, автоматически устанавливая ее в качестве зарезервированной памяти.См .: https://bugs.openjdk.java.net/browse/JDK-8191369

...