Я думаю, что различие между физическим и логическим в этом случае немного размыто. Поскольку HotSpot по желанию JIT будет переводить ваш код в собственный код, а результат может зависеть от ряда оптимизаций, можно утверждать, что оба представления правильны.
Или можно сказать, что стек является физическим, но то, что идет в стек, является переменным и не всегда простым для получения из исполняемого кода Java. Например, вызовы функций могут быть встроенными или нет, поэтому для вызова вашей функции из одного места может потребоваться дополнительное место в стеке, а для вызова той же функции из другого места или в другое время может не потребоваться или потребоваться меньше (или Больше). Это называется глубоким встраиванием в этого документа . Если вы помещаете ссылки в стек, их размер также может изменяться (существуют приемы, позволяющие иногда сжимать ссылки в 32 бита даже в 64-битной JVM). Поскольку JIT-компилятор работает асинхронно и принимает некоторые решения на основе профилирования данных из выполнения кода, один и тот же код может иметь разную производительность и, возможно, также использовать стек во время разных запусков.
EDIT:
Сборщик мусора, JIT-компилятор и т. Д. Работают в отдельных потоках, поэтому они используют свои собственные стеки вызовов, если вы это подразумеваете под «издержками HotSpot».