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

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

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


person Alex Raj Kaliamoorthy    schedule 17.04.2018    source источник
comment
Это дубликат stackoverflow. com/questions/6091615/ (в котором хотя бы один ответ дает ответ на этот вопрос, то есть нет). Я не могу проголосовать за закрытие, потому что случайно отозвал свое первоначальное закрытие.   -  person JeremyP    schedule 17.04.2018
comment
Это не дублирующий вопрос. Я не спрашиваю о разнице между памятью в куче и вне кучи, или мой вопрос заключается в том, чтобы найти разницу между памятью в стеке и кучей. Вопрос в том, чтобы понять, являются ли память вне кучи и память стека одинаковыми или нет?   -  person Alex Raj Kaliamoorthy    schedule 17.04.2018
comment
Этот ответ stackoverflow.com/a/13894476/169346 на этот вопрос расскажет вам все, что вам нужно знать. Ответ - нет, они не одинаковы.   -  person JeremyP    schedule 17.04.2018
comment
@JeremyP, спасибо за совет. Я обновил свой вопрос, и если бы вы могли просмотреть и оставить свои комментарии, было бы здорово.   -  person Alex Raj Kaliamoorthy    schedule 17.04.2018


Ответы (1)


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

Различия:

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

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


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

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

person Stephen C    schedule 17.04.2018