Стек кажется самым простым местом в архитектуре JVM. Но именно поэтому ошибки в нем самые жесткие: они убивают поток мгновенно, не давая шансов сборщику мусора что-то исправить.
Ниже привожу основные проблемы и способы их устранения у стека:
Проблема 1: StackOverflowError
Почему это больно: Съеден весь отведенный лимит памяти потока (лимит `-Xss`).
Что делать: Заменяем рекурсию на цикл (`while`/`for`). Если архитектура требует именно рекурсии — увеличиваем флаг запуска `-Xss` (например, до `2m`) или используем Tail Call Optimization там, где JVM его поддерживает.
Проблема 2: Медленные глубокие вызовы
Почему это больно: Создание и удаление сотен стековых фреймов создает избыточную нагрузку на CPU и приводит к промахам мимо кэша процессора.
Что делаем: Разбиваем монолитные методы на чистые функции для читаемости, но избегаем глубоких цепочек вызовов внутри горячих циклов (*hot paths*).
Проблема 3: Крах OS при свободном Stack
Почему это больно: Утечка в нативном коде (JNI) вне контроля сборщика мусора JVM; исчерпан лимит виртуальной памяти процесса.
Что делаем: Мониторим RSS-память процесса отдельно от Heap. Используем инструменты анализа нативной памяти: NMT (`-XX:NativeMemoryTracking=detail`), Valgrind или Async-profiler с режимом `mem`.