Память вне кучи и память стека - это одно и то же?

Я знаю разницу между стековой и кучной памятью, однако во многих блогах я встречал слово «память off-heap». Я просмотрел множество блогов и видео на YouTube, чтобы узнать, есть ли какая-либо связь между памятью вне кучи и памятью стека? Согласно популярному ответу этого вопрос, я могу понять, что память вне кучи относится к объектам хранилища, которые управляются EHCache и не подвергаются сборке мусора. Это определение идеально, но у меня вопрос: память вне кучи - это то же самое, что и стековая память, или все вместе это другая сущность в управлении памятью?

Редактировать: Если они не совпадают, не мог бы кто-нибудь подробно объяснить, что их отличает, с некоторыми базовыми объяснениями. Я новичок в управлении памятью Java.

Это дубликат stackoverflow.com/questions/6091615/… (в котором хотя бы один ответ дает ответ на этот вопрос, а это нет). Я не могу проголосовать за закрытие, потому что я случайно отозвал свое первоначальное голосование за закрытие.

JeremyP 17.04.2018 16:19

Это не повторяющийся вопрос. Я не спрашиваю о разнице между памятью в куче и вне кучи, или мой вопрос заключается в том, чтобы найти разницу между памятью стека и кучи. Вопрос в том, одинаковы ли память off-heap и стековая память?

Alex Raj Kaliamoorthy 17.04.2018 16:20

Этот ответ stackoverflow.com/a/13894476/169346 на этот вопрос расскажет вам все, что вам нужно знать. Ответ: «Нет, они не такие».

JeremyP 17.04.2018 16:23

@JeremyP, спасибо за совет. Я обновил свой вопрос, и если бы вы могли просмотреть и оставить свои комментарии, было бы здорово.

Alex Raj Kaliamoorthy 17.04.2018 16:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
504
1

Ответы 1

Они не одинаковы.

Различия:

  • память стека организована как стек, который отслеживает время жизни вызовов методов, но память вне кучи не
  • память стека выделяется и освобождается неявно 1, когда методы вызываются и когда они возвращают 2, но память вне кучи выделяется и освобождается (обычно) вызовами машинного кода.

Это все, что нужно знать типичному Java-разработчику. Если вы хотите копнуть глубже, взгляните на исходный код OpenJDK.


1 - The stacks themselves are allocated implicitly by Thread.start() and freed when a thread terminates. They are a form of off-heap memory, but they need to be requested from the OS in order to implement the "red zone" that is typically used to detect stack overflow ...

2 - This ignores the fact that when "escape analysis" is enabled, the JIT may generate code that allocates local objects onto the stack. If that happens, then the notional allocation and releasing of stack memory may happen within a method call.

Другие вопросы по теме