Являются ли память вне кучи и память стека одинаковыми?

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

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

1 ответ

Они не то же самое.

Различия:

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

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


1 - Сами стеки неявно распределяются с помощью Thread.start() и освобождаются при завершении потока. Они представляют собой форму памяти вне кучи, но их необходимо запрашивать у ОС, чтобы реализовать "красную зону", которая обычно используется для обнаружения переполнения стека...

2 - Это игнорирует тот факт, что когда включен "escape-анализ", JIT может генерировать код, который распределяет локальные объекты в стеке. Если это произойдет, то условное выделение и освобождение стековой памяти может произойти в вызове метода.

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