Подтвердить что ты не робот

Зачем уменьшать размер стека потоков Java JVM?

Я читал статью об обработке ошибок Out Of Memory на Java (и на платформе JBoss), и я видел это предложение, чтобы уменьшить размер стопки резьбы.

Как уменьшить размер справки с помощью макс. ошибки памяти?

4b9b3361

Ответ 1

Когда Java создает новый поток, он предварительно выделяет блок памяти фиксированного размера для этого стека потоков. Уменьшая размер этого блока памяти, вы можете избежать нехватки памяти, особенно если у вас много потоков - экономия памяти - это уменьшение размера стека, умноженное на количество потоков.

Недостатком этого является то, что вы увеличиваете вероятность ошибки.

Обратите внимание, что стеки потоков создаются вне кучи JVM, поэтому, даже если в куче имеется много памяти, вы все равно можете создать стек потока из-за нехватки памяти (или исчерпания адресного пространства, как правильно указывает Том Хоутин).

Ответ 2

Проблема существует на 32-разрядных JVM, поскольку адресное пространство может исчерпаться. Уменьшение максимального размера стека обычно не уменьшает объем фактически распределенной памяти. Рассмотрим 8k потоков с 256kB, зарезервированных для стека 1k 2MB, что осталось 31 бит адресного пространства (2GB).

Проблема почти исчезает с 64-разрядными JVM (хотя реальный объем памяти будет немного увеличиваться, потому что ссылки в два раза больше). В качестве альтернативы использование неблокирующих API-интерфейсов может устранить необходимость в довольно большом количестве потоков.

Ответ 3

В процессе есть N потоков, а для каждого стека потоков выделяется M байт памяти. Общая память, выделенная для использования стека, равна N x M.

Вы можете уменьшить общую память, потребляемую стекем, уменьшив количество потоков (N) или уменьшив память, выделенную для каждого потока (M).


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

Поиск оптимального размера стека может быть искусством.

Ответ 4

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


Я никогда не получал это право даже после тщательного изучения. Но опять же, я, возможно, никогда не сталкивался с комбинацией веб-приложений/контейнеров, которую можно было бы оштрафовать, изменив размер стека потоков. У меня были намного лучшие (и не смертельные) результаты, изменяющие коэффициент выживаемости. Но это был мой опыт работы. В разных рабочих местах и ​​приложениях YMMV.