Я читал статью об обработке ошибок Out Of Memory на Java (и на платформе JBoss), и я видел это предложение, чтобы уменьшить размер стопки резьбы.
Как уменьшить размер справки с помощью макс. ошибки памяти?
Я читал статью об обработке ошибок Out Of Memory на Java (и на платформе JBoss), и я видел это предложение, чтобы уменьшить размер стопки резьбы.
Как уменьшить размер справки с помощью макс. ошибки памяти?
Когда Java создает новый поток, он предварительно выделяет блок памяти фиксированного размера для этого стека потоков. Уменьшая размер этого блока памяти, вы можете избежать нехватки памяти, особенно если у вас много потоков - экономия памяти - это уменьшение размера стека, умноженное на количество потоков.
Недостатком этого является то, что вы увеличиваете вероятность ошибки.
Обратите внимание, что стеки потоков создаются вне кучи JVM, поэтому, даже если в куче имеется много памяти, вы все равно можете создать стек потока из-за нехватки памяти (или исчерпания адресного пространства, как правильно указывает Том Хоутин).
Проблема существует на 32-разрядных JVM, поскольку адресное пространство может исчерпаться. Уменьшение максимального размера стека обычно не уменьшает объем фактически распределенной памяти. Рассмотрим 8k потоков с 256kB, зарезервированных для стека 1k 2MB, что осталось 31 бит адресного пространства (2GB).
Проблема почти исчезает с 64-разрядными JVM (хотя реальный объем памяти будет немного увеличиваться, потому что ссылки в два раза больше). В качестве альтернативы использование неблокирующих API-интерфейсов может устранить необходимость в довольно большом количестве потоков.
В процессе есть N потоков, а для каждого стека потоков выделяется M байт памяти. Общая память, выделенная для использования стека, равна N x M.
Вы можете уменьшить общую память, потребляемую стекем, уменьшив количество потоков (N) или уменьшив память, выделенную для каждого потока (M).
Часто нить не будет использовать весь стек. Он предварительно выделяется "в случае", это понадобится позже, но если поток не использует глубокий путь вызова или не использует рекурсию, ему может не понадобиться все пространство стека, выделенное от его имени.
Поиск оптимального размера стека может быть искусством.
Я попробую другие вещи (например, изменить коэффициент выживаемости или размер пространства, выделенного для определений классов), прежде чем пытаться изменить размер стека потоков. Трудно понять это правильно, поэтому очень легко получить ошибку (что также является фатальным как ошибка из памяти).
Я никогда не получал это право даже после тщательного изучения. Но опять же, я, возможно, никогда не сталкивался с комбинацией веб-приложений/контейнеров, которую можно было бы оштрафовать, изменив размер стека потоков. У меня были намного лучшие (и не смертельные) результаты, изменяющие коэффициент выживаемости. Но это был мой опыт работы. В разных рабочих местах и приложениях YMMV.