Статическое распределение в Java - куча, стек и постоянное поколение

StackOverflow https://stackoverflow.com/questions/3849634

Вопрос

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

  1. Классы (загруженные классами) Идут в специальной области на куче: постоянное поколение
  2. Вся информация, связанная с классом, похожем на название класса, объектные массивы, связанные с классом, внутренние объекты, используемые JVM (например, Java / lang / объект), и информация оптимизации, и информация о оптимизации входит в область постоянного поколения.
  3. Все статические переменные элементов снова хранятся в зоне постоянного поколения.
  4. Объекты идут на другую кучу: молодое поколение
  5. Существует только одна копия каждого метода на класс, будет метод статическим или нестатическим. Эта копия помещается в область постоянного поколения. Для нестатических методов все параметры и локальные переменные переходят на стек - и всякий раз, когда есть конкретный вызов этого метода, мы получаем новый кадр стека, связанной с ним. Я не уверен, где хранятся локальные переменные статического метода. Они на куче постоянного поколения? Или только их ссылка хранится в области постоянного поколения, а фактическая копия где-то еще (где?)
  6. Я также не уверен, где хранится тип возврата метода.
  7. Если объекты (в молодого поколения) необходимо использовать статический элемент (в постоянном генерировании), им дается ссылка на статический элемент && им задается достаточно места памяти, чтобы сохранить тип возврата метода и т. Д.

Спасибо за прохождение этого!

Это было полезно?

Решение

Во-первых, как следует указать вам, что там очень мало людей, которые могут подтвердить эти ответы от знания первых рук. Очень немногие люди работали над недавней достойной точкой JVMS или изучали их на глубину, необходимую для действительно знания. Большинство людей здесь (в комплекте) отвечают на основе вещей, которые они видели, написанные в другом месте, или то, что они предпочитают. Обычно то, что здесь написано, или в различных статьях и веб-страницах, основаны на других источниках, которые могут быть или не могут быть окончательными. Часто упрощенно, неточность или просто неправильно неправильно.

Если вы хотите окончательное подтверждение ваших ответов, вам действительно нужно скачать OpenJDK Sourcecode ... и делать свои собственные исследования Чтение и понимание исходного кода. Задавая вопросы, так или трантинги через случайные веб-статьи не являются звуковым академическим исследованием.

Было сказано, что ...

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

Afaik, да. (Обновлять: Смотри ниже.)

2) Вся информация, связанная с классом, похожим на название класса, объектные массивы, связанные с классом, внутренние объекты, используемые JVM (например, Java / Lang / Object) и информация оптимизации, и информация о оптимизации входит в область постоянного поколения.

Более или менее, да. Я не уверен, что вы подразумеваете под тем из тех вещей. Я предполагаю, что «внутренние объекты, используемые JVM (например, Java / Lang / Object)» означает дескрипторы класса JVM-внутреннего класса.

3) Все статические переменные элементов снова хранятся в зоне постоянного поколения.

Переменные самих да. Да. Эти переменные (например, все переменные Java) будут иметь примитивные значения или ссылки на объекты. Однако, в то время как переменные статического элемента находятся в кадре, который выделяется в кучи Premgen, объекты / массивы, упомянутые этими переменными, могут быть выделены в Любые куча

4) Объекты идут на другую кучу: молодое поколение

Не обязательно. Большие предметы мая быть выделенным непосредственно в поколении

5) Существует только одна копия каждого способа на класс, представляет собой метод статическим или нестатическим. Эта копия помещается в область постоянного поколения.

Предполагая, что вы ссылаетесь на код метода, то AFAIK да. Это может быть немного сложнее. Например, этот код может существовать в Bytecode и / или нативном коде, в разное время во время жизни JVM.

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

Да.

... Я не уверен, где хранятся локальные переменные статического метода. Они на куче постоянного поколения? Или только их ссылка хранится в области постоянного поколения, а фактическая копия где-то еще (где?)

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

6) Я также не уверен, где хранится тип возврата метода.

Если вы имеете в виду ценность Возвращена вызовом метода (ненушенного) методом, то он либо возвращен в стеке, либо в регистре машины. Если он возвращается в стеке, это занимает 1 или два слова, в зависимости от типа возврата.

7) Если объекты (в молодого поколения) Nees используют статический элемент (в постоянном генерировании), им дается ссылка на статический элемент && им задается достаточно места памяти для хранения возвращаемого типа метода и т. Д. Отказ

Это неточно (или, по крайней мере, вы не выражаете себя четко).

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

  • Ни в коем случае не делает новый Хранение должна быть выделена, чтобы удерживать ссылку или примитивное значение.

  • Как правило, одно слово памяти - это все, что необходимо для хранения объекта или справки массива, а примитивное значение обычно занимает одно или два слова, в зависимости от архитектуры аппаратного обеспечения.

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

ОБНОВИТЬ

По состоянию на Java 8, пространство Prengen было заменено MetaSpace. Для получения дополнительной информации, пожалуйста, обратитесь к этим ресурсам:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top