Переменная Java, помещенная в стек или кучу
У меня нет большой идеи по Java.
Я просматривал несколько ссылок, и наш блог говорит: "Примитивы Java, хранящиеся в стеке", которые, как мне кажется, зависят от переменной экземпляра или локальной переменной.
Пройдя несколько ссылок, мой вывод:
Переменные класса - примитивы - хранятся в куче как часть объекта, который он содержит.
Переменные класса - объект (определяемый пользователем) - хранятся в куче как часть объекта, который он содержит. Это верно как для ссылочного, так и для фактического объекта.
Переменные метода - примитивы - хранятся в стеке как часть этого фрейма стека.
Переменные метода - объект (определяемый пользователем) - хранятся в куче, но ссылка на эту область в куче хранится в стеке как часть этого фрейма стека.
Ссылки могут также храниться в куче, если объект содержит в себе другой объект.
Статические методы (фактически все методы), а также статические переменные хранятся в куче.
Пожалуйста, поправьте меня, если мое понимание ошибочно. Спасибо.
Ответы
Ответ 1
В JVM есть несколько оптимизаций, которые могут даже использовать Stack for Objects, что уменьшает сбор мусора.
Классы хранятся в специальной части кучи, но это зависит от используемой вами JVM. (Permgen f.e. in Hotspot <= 24).
В общем, вам не нужно думать о том, где хранятся данные, но больше о семантике, например о видимости и о том, как долго что-то живет. Ваше объяснение в вопросах выглядит хорошо.
Ответ 2
Объект хранится в куче.
Ссылка на объект хранится в стеке.
Статическая переменная, хранящаяся в области метода.
Пример abc obj = new abc();
Сохранение объекта abc в куче и ссылка на объект хранится в стеке.
static int я = 10;
i, сохраненная в области метода.
Ответ 3
"Переменные метода - объект (определяемый пользователем) - хранятся в куче, но..."
Неправильно.
Во-первых, переменные метода называются локальными переменными.
Пусть рассмотрим
public static void main(String[] args) {
List<Integer> model = new ArrayList<Integer>();
Переменная model
помещается в стек стека, а не в кучу. Связанный объект, сгенерированный с помощью new ArrayList<Integer>()
, помещается в кучу, но это не локальная переменная.
3 вещи:
- variable
model
- сгенерированный объект
- ссылка на этот объект, хранящийся в переменной
совершенно разные, не испортите их.