Выделение памяти Java (стека) для локальных переменных

#java

#java

Вопрос:

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

  1. Я читал о куче и стековой памяти для переменной экземпляра объекта и локальной переменной. У меня вопрос, создается ли новый СТЕК для каждого метода?? или для каждого класса отдельный стек используется целым классом??
  2. Я читал, что каждый поток создает ОДИН СТЕК, что означает

Спасибо Mahaveer

Ответ №1:

У каждого потока есть свой собственный стек.

  • Всякий раз, когда вы используете new , в куче создается объект.
  • Локальные переменные хранятся в стеке. Это включает в себя примитивы (такие как int ) и ссылки на любые созданные объекты. Сами фактические объекты не создаются в стеке, как я упоминал, когда вы используете new , они будут созданы в куче.

У меня есть вопрос о том, создается ли новый СТЕК для каждого метода??

Тот же стек используется при вызове метода. Метод создаст свой собственный небольшой раздел в стеке, называемый «фреймом стека», который используется для хранения его локальных переменных.

Это похоже на набор таблиц, когда вызывается метод, таблица добавляется в верхнюю часть стека (фрейм стека), и когда этот метод завершается, таблица удаляется из стека. Все локальные переменные этого метода будут уничтожены вместе с ним, но фактические объекты, созданные с помощью new , не будут.

Сборщик мусора JVM позаботится об уничтожении объектов в куче (тех, которые созданы с помощью new ), когда увидит, что они вам больше не нужны.

Комментарии:

1. Спасибо AusCBloke за простую иллюстрацию. как вы сказали, тот же стек используется при вызове метода. Метод создаст свой собственный небольшой раздел в стеке, называемый «фреймом стека», который используется для хранения его локальных переменных. это означает, что фрейм стека разделен на две части, в одной из которых содержится вызов метода, а в другой — переменные.. Я прав?? или это происходит по-другому??

2. @MahaveerMuttha фрейм стека — это, по сути, собственное небольшое временное пространство памяти метода, где он может хранить свои локальные переменные. Когда этот метод вызывает другой метод, фрейм стека этого другого метода создается сверху, и выполнение переходит к этому новому методу. Когда второй метод завершится, его фрейм будет уничтожен (извлечен из стека), а первый продолжится, как будто ничего другого не произошло. Стек будет в том же состоянии, что и до вызова второго метода.

Ответ №2:

  • У каждого потока есть собственный стек.
  • Каждый метод имеет частный фрейм стека в стеке этого потока.

Стеки связаны с потоком в сопоставлении «один к одному». Стеки абсолютно не связаны с методами и классами.

Способ рассуждать обо всем этом заключается в том, что локальные переменные метода являются частными для каждого вызова этого метода.

Комментарии:

1. спасибо @David. Но все же у меня есть одно сомнение: когда мы говорим, что локальные переменные хранятся в памяти стека, что это значит??

2. Это означает, что локальные переменные хранятся в частном фрейме стека рассматриваемого метода выполнения.

3. вы говорите, что каждый метод имеет частный фрейм стека, в котором затем хранятся локальные переменные, используемые этим методом?? создается ли новый стек для переменных??

4. Каждый вызов метода имеет частный фрейм стека. Если метод выполняется в двух разных потоках, то существует два разных стековых фрейма, по одному для каждого вызова.

Ответ №3:

Конечно, java garbage collector всегда обрабатывает кучу, когда у него появляется шанс быть выполненным, поэтому он ищет только бесхозные объекты и удаляет их, вот почему ключевое слово NEW в java всегда создает новые объекты в памяти кучи.