#java
#java
Вопрос:
Я изучаю Java, и прямо сейчас я застрял на распределении памяти объекта и локальных переменных. может ли кто-нибудь проиллюстрировать или прояснить некоторые из моих сомнений??
- Я читал о куче и стековой памяти для переменной экземпляра объекта и локальной переменной. У меня вопрос, создается ли новый СТЕК для каждого метода?? или для каждого класса отдельный стек используется целым классом??
- Я читал, что каждый поток создает ОДИН СТЕК, что означает
Спасибо Mahaveer
Ответ №1:
У каждого потока есть свой собственный стек.
- Всякий раз, когда вы используете
new
, в куче создается объект. - Локальные переменные хранятся в стеке. Это включает в себя примитивы (такие как
int
) и ссылки на любые созданные объекты. Сами фактические объекты не создаются в стеке, как я упоминал, когда вы используетеnew
, они будут созданы в куче.
У меня есть вопрос о том, создается ли новый СТЕК для каждого метода??
Тот же стек используется при вызове метода. Метод создаст свой собственный небольшой раздел в стеке, называемый «фреймом стека», который используется для хранения его локальных переменных.
Это похоже на набор таблиц, когда вызывается метод, таблица добавляется в верхнюю часть стека (фрейм стека), и когда этот метод завершается, таблица удаляется из стека. Все локальные переменные этого метода будут уничтожены вместе с ним, но фактические объекты, созданные с помощью new
, не будут.
Сборщик мусора JVM позаботится об уничтожении объектов в куче (тех, которые созданы с помощью new
), когда увидит, что они вам больше не нужны.
Комментарии:
1. Спасибо AusCBloke за простую иллюстрацию. как вы сказали, тот же стек используется при вызове метода. Метод создаст свой собственный небольшой раздел в стеке, называемый «фреймом стека», который используется для хранения его локальных переменных. это означает, что фрейм стека разделен на две части, в одной из которых содержится вызов метода, а в другой — переменные.. Я прав?? или это происходит по-другому??
2. @MahaveerMuttha фрейм стека — это, по сути, собственное небольшое временное пространство памяти метода, где он может хранить свои локальные переменные. Когда этот метод вызывает другой метод, фрейм стека этого другого метода создается сверху, и выполнение переходит к этому новому методу. Когда второй метод завершится, его фрейм будет уничтожен (извлечен из стека), а первый продолжится, как будто ничего другого не произошло. Стек будет в том же состоянии, что и до вызова второго метода.
Ответ №2:
- У каждого потока есть собственный стек.
- Каждый метод имеет частный фрейм стека в стеке этого потока.
Стеки связаны с потоком в сопоставлении «один к одному». Стеки абсолютно не связаны с методами и классами.
Способ рассуждать обо всем этом заключается в том, что локальные переменные метода являются частными для каждого вызова этого метода.
Комментарии:
1. спасибо @David. Но все же у меня есть одно сомнение: когда мы говорим, что локальные переменные хранятся в памяти стека, что это значит??
2. Это означает, что локальные переменные хранятся в частном фрейме стека рассматриваемого метода выполнения.
3. вы говорите, что каждый метод имеет частный фрейм стека, в котором затем хранятся локальные переменные, используемые этим методом?? создается ли новый стек для переменных??
4. Каждый вызов метода имеет частный фрейм стека. Если метод выполняется в двух разных потоках, то существует два разных стековых фрейма, по одному для каждого вызова.
Ответ №3:
Конечно, java garbage collector всегда обрабатывает кучу, когда у него появляется шанс быть выполненным, поэтому он ищет только бесхозные объекты и удаляет их, вот почему ключевое слово NEW в java всегда создает новые объекты в памяти кучи.