Являются ли память вне кучи и память стека одинаковыми?
Я знаю разницу между памятью стека и кучи, однако во многих блогах я встречал это слово off-heap
объем памяти. Я просмотрел много блогов и видео на YouTube, чтобы выяснить, есть ли какая-либо связь между памятью вне кучи и памятью стека? Согласно популярному ответу на этот вопрос, я могу понять, что память вне кучи относится к объектам хранилища, которые управляются EHCache и не подвергаются сборке мусора. Это определение идеально, но мой вопрос в том, является ли память вне кучи такой же, как память стека, или все вместе - это другой объект в управлении памятью?
Изменить: Если они не одинаковы, может кто-нибудь объяснить, чем они отличаются, с некоторыми базовыми объяснениями. Я совершенно новичок в управлении памятью Java.
1 ответ
Они не то же самое.
Различия:
- стековая память организована как стек, который отслеживает время жизни вызовов методов, но не куча памяти не
- стековая память выделяется и освобождается неявно 1 при вызове методов и когда они возвращают 2, но память вне кучи выделяется и освобождается (как правило) при вызовах нативного кода.
Это все, что нужно знать типичному разработчику Java. Если вы хотите копнуть глубже, взгляните на исходный код OpenJDK.
1 - Сами стеки неявно распределяются с помощью Thread.start() и освобождаются при завершении потока. Они представляют собой форму памяти вне кучи, но их необходимо запрашивать у ОС, чтобы реализовать "красную зону", которая обычно используется для обнаружения переполнения стека...
2 - Это игнорирует тот факт, что когда включен "escape-анализ", JIT может генерировать код, который распределяет локальные объекты в стеке. Если это произойдет, то условное выделение и освобождение стековой памяти может произойти в вызове метода.