«Статический» не означает «в стеке».
Объекты, выделенные при инициализации статических переменных класса или в статических кодовых блоках , размещаются статически в том смысле, что распределение выполняется во время загрузки класса (что может быть сделано статически сразу после запуска программы).
Теоретически вы могли бы написать java-программу, используя только такие выделения, и она была бы статически распределенной , так же, как программа на C, которая никогда не вызывала malloc, просто имела фиксированные буферы для материала, который она хотел сделать.
Если такая программа успешно запускается, это доказывает, что памяти достаточно для всего, что она может сделать, и поэтому она никогда не получит ошибку нехватки памяти, проблему фрагментации или паузу GC.
Он просто, если правильно написано, выдаст много сообщений об ошибках, говорящих «Я не могу этого сделать».