Подтвердить что ты не робот

Переменная Java, помещенная в стек или кучу

У меня нет большой идеи по Java.

Я просматривал несколько ссылок, и наш блог говорит: "Примитивы Java, хранящиеся в стеке", которые, как мне кажется, зависят от переменной экземпляра или локальной переменной.

Пройдя несколько ссылок, мой вывод:


Переменные класса - примитивы - хранятся в куче как часть объекта, который он содержит.

Переменные класса - объект (определяемый пользователем) - хранятся в куче как часть объекта, который он содержит. Это верно как для ссылочного, так и для фактического объекта.

Переменные метода - примитивы - хранятся в стеке как часть этого фрейма стека.

Переменные метода - объект (определяемый пользователем) - хранятся в куче, но ссылка на эту область в куче хранится в стеке как часть этого фрейма стека. Ссылки могут также храниться в куче, если объект содержит в себе другой объект.

Статические методы (фактически все методы), а также статические переменные хранятся в куче.

Пожалуйста, поправьте меня, если мое понимание ошибочно. Спасибо.

4b9b3361

Ответ 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
  • сгенерированный объект
  • ссылка на этот объект, хранящийся в переменной

совершенно разные, не испортите их.