В Java, сколько памяти выделено в стеке и куче для "new Object ()" - PullRequest
0 голосов
/ 21 сентября 2018

Это был один из моих вопросов на собеседовании, но я все еще пытаюсь разобраться с этим.Если я создаю "new Object ()", ссылка на этот объект будет в стеке, который будет 8 байтов на 64-битной.Тогда вопрос был в том, что в куче.Позже интервьюер упомянул, что в куче всегда выделяются две вещи: объект «Класс» и «Монитор».Может кто-нибудь объяснить немного больше о том, сколько памяти / что выделяется при создании "new Object ()"?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Если я создаю "new Object ()", ссылка на этот объект будет в стеке, который будет 8 байтов на 64-битной.

Скорее всего, это будет 4 байта даже для 64-битной JVM.Oracle / OpenJDK поддерживают CompressesOops, которые используют 4 байта для ссылок.

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

Заголовок объекта.У него нет полей.

Позднее интервьюер упомянул, что в куче всегда будут выделяться две вещи: объект "Класс"

A Class объект являетсяпрокси для информации, хранящейся в куче.Он не должен существовать, даже если экземпляры класса существуют (хотя для Object это, вероятно, уже существует)

, а также «Monitor».

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

Может кто-нибудь объяснить, пожалуйста, немного больше о том, сколько памяти / что выделяется при создании "new Object ()"?

В 64-битной JVM заголовок по умолчанию составляет 12 байтов, однако при выравнивании объектов он будет использовать 16 байтов.В 32-разрядной JVM это будет всего 8 байтов.

В 32-разрядной JVM и 64-разрядной JVM с CompressedOops ссылка составляет всего 4 байта (что является большинством JVM)

0 голосов
/ 21 сентября 2018

Ваш new Object() не имеет ссылки.Это просто объект, который будет размещен в пространстве кучи.

Если бы это было похоже на

Object someReference = new Object();

, тогда someReference было бы в стеке нить .Однако сам объект всегда будет в куче.

Давайте рассмотрим пример:

Если бы вы выполнили этот оператор:

Employee emp = new Employee();

Вы бы получилипамять как:

  • Куча : хранит new Employee() то есть фактический объект
  • Стек : хранит информацию о emp то есть ссылку
  • Пространство Пермь / Metaspace : хранит информацию о Employee class
...