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

Где хранится класс, объект, ссылочная переменная в java. В куче или в стеке? Где находится куча или стопка?

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

4b9b3361

Ответ 1

Область данных времени выполнения в JVM можно разделить, как показано ниже,

  • Область метода: Область хранения для файлов скомпилированных классов. (По одному на экземпляр JVM)

  • Куча: Область хранения для объектов. (По одному на экземпляр JVM)

  • Стек Java: Область хранения для локальных переменных, результаты промежуточных операций. (По одному на поток)

  • Регистрация ПК: Сохраняет адрес следующей команды, которая должна быть выполнена, если следующая инструкция является нативным методом, тогда значение в регистре pc будет undefined. (По одному на поток)

  • Нативные стеки методов: помогает выполнять собственные методы (методы, написанные на языках, отличных от Java). (По одному на поток)

Ответ 2

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

Примечание: объект и ссылки на объект это разные вещи.

1) В Java есть новое ключевое слово, которое очень часто используется для создания нового объекта. Но что нового делает, так это выделяет память для объекта класса, который вы создаете, и возвращает ссылку.

Это означает, что всякий раз, когда вы создаете объект как статический или локальный, он сохраняется в HEAP.

2) Все примитивы переменных класса или ссылки на объекты (которые являются просто указателем на место, где хранится объект, т.е. куча) также хранятся в куче.

3) Классы, загруженные загрузчиком классов и статическими переменными, а также ссылки на статические объекты хранятся в специальном месте в куче, постоянная генерация которой.

4) Локальные примитивные переменные, ссылки на локальные объекты и параметры метода хранятся в стеке.

5) Локальные функции (методы) хранятся в стеке, но статические функции (методы) хранятся в постоянном хранилище.

6) Вся информация, относящаяся к классу, такая как имя класса, массивы объектов, связанные с классом, внутренние объекты, используемые JVM (например, java/lang/Object) и информация об оптимизации, попадает в область постоянного создания.

7) Для понимания стека, кучи, данных, которые вы должны прочитать о процессах и блоке управления процессами в операционных системах.

Ответ 3

Все объекты в Java хранятся в куче. "Переменные", которые содержат ссылки на них, могут находиться в стеке, или они могут содержаться в других объектах (тогда они не являются действительно переменными, но полями), что также помещает их в кучу.

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

Ответ 4

Секция памяти в стеке содержит методы, локальные переменные и ссылочные переменные.

Раздел "Куча" содержит объекты (также может содержать ссылочные переменные).

после короткого google, я нашел ссылку, чтобы описать его, да youtube video. ^ _ ^

http://www.youtube.com/watch?v=VQ4eZw6eVtQ

Ответ 5

Согласно спецификации JVM,

Классы и собственный собственный пул, то есть статические переменные хранятся в области метода. Здесь класс означает ничего, кроме группы полей, методов и констант, эти методы в форме инструкций хранятся в области метода и могут быть идентифицированы по адресу.

Объекты - это не что иное, как заполненный шаблон класса, который будет создан в области кучи, но ссылка на объект создается в Stack.

public class Sample{
int field;
static int constant;
public void test(){
int localVariable=10;
Sample samp=new Sample();
  }
}

В этом примере, sample.class перейдет в область метода, это означает, что в области "Метод" выделяются "поле", "константа" и "тест" метода.

Когда запуск запускается, Объект, созданный new Sample(), перейдет в Куча, но 'samp' - это просто ссылка на объект, которая идет в стек и содержит адрес объекта, который присутствует в Heap

Для получения дополнительной информации, пожалуйста, проверьте эту ссылку, Спецификация JVM

Ответ 6

Локальные переменные (переменные метода) + методы живут в стеке. Пока объекты и их переменная экземпляра живут в куче.

Теперь ссылочной переменной может быть локальная переменная (если она создается внутри метода) или переменная экземпляра (если она создана внутри класса, но снаружи метода). Таким образом, ссылочная переменная может быть где угодно: стек или куча.

Ответ 7

В Java переменная может либо содержать ссылку на объект (s in String s="OOO" содержит ссылку на объект "OOO"), либо примитивное значение (i in int i=10 содержит 10). Эти переменные могут быть либо в куче, либо в стеке, в зависимости от того, являются ли они локальными или нет, и какой вкус JVM вы используете.

В документе спецификации виртуальной машины Java 8 (https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html) организация памяти, относящаяся к этому, выглядит следующим образом.

  • Каждый поток Java имеет свой собственный стек JVM.

    Он содержит локальные переменные и частичные результаты и играет роль в вызов и возврат метода.

    В стеке могут быть ссылки на объекты. The спецификация не различает примитивную переменную и ссылочную переменную, если она локальная. Этот стек используется с использованием единицы данных, называемые кадрами. Однако

    Поскольку стек виртуальной машины Java никогда не управляется напрямую кроме как нажимать и поп-фреймы, кадры могут быть выделены в кучу.

    Следовательно, это зависит от реализации спецификации JVM (например, OpenJDK или Oracle), где находятся фреймы.

  • У каждого экземпляра JVM есть куча. Куча

    ... область данных времени выполнения, из которой сохраняется память для всех экземпляров класса и массивы.

    Фактическая память, хранящая данные объектов, находится в куче. куча разделяется между всеми потоками JVM. Это также включает объект ссылки, которые являются частью объектов, т.е. переменными экземпляра.

    Например, возьмите следующие классы.

    class Moo{ private String string= "hello"; } class Spoo{ private Moo instanceReferenceVariable = new Moo(); public void poo(){ int localPrimitiveVariable=12; Set<String> localReferenceVariable = new HashSet<String>(); } }

    Здесь объект, на который ссылается переменная instanceReferenceVariable
    будет в куче, и, следовательно, все переменные экземпляра этого объекта, например string, также будет в куче. Переменные localPrimitiveVariable и localReferenceVariable будет в стеке.

  • Область метода: область метода является ограниченной частью кучи, которая

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

  • Постоянный пул времени выполнения: это часть области метода.

Надеюсь, что это удалось прояснить.

Ответ 8

Концепция довольно проста:

  1. Переменные экземпляра (примитив, классы Wrapper, ссылки, объекты (нестатические)) - куча
  2. Локальные переменные, ссылки - стек
  3. Другие объекты данных, такие как: метаданные класса, код JVM, статические переменные, ссылки на статические объекты, статические функции и т.д., Которые ранее использовались в Permgen Space (до Java 7), теперь перемещаются в Metaspace в JAVA 8.

PS: Metaspace является частью собственной памяти, поэтому не нужно беспокоиться об OOM: Pergem Exeption сейчас.

Больше подробностей: https://siddharthnawani.blogspot.com/