Java и макет памяти - PullRequest
       7

Java и макет памяти

0 голосов
/ 11 ноября 2009

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

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

interface Lovable
   public void love();

class Foo implements Lovable
   public void love();
      // something
   public int val()
      // return something1

public class Love
   public static void main(String args [])
      Foo foo = new Foo()
      foo.love()
      foo.love()
      int bar = =foo.val()
      System.out.print(v)

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

поэтому в нижней части стека будет класс Love (также содержит int bar), указатель, который указывает на Foo foo в куче, фрейм для foo.love (), еще один фрейм foo.love (), a Фрейм для foo.val (), фрейм для печати?

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

Ответы [ 3 ]

3 голосов
/ 11 ноября 2009

Обычно объекты хранятся в куче , управляемой сборщиком мусора.

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

Информация о классе хранится в пробелах .

1 голос
/ 11 ноября 2009

Расположение памяти зависит от JVM, и у JVM есть много возможностей для использования памяти, если они поддерживают логическое представление объектной модели Java, о которой думает программист. У Sun JVM есть несколько «куч», потому что она реализует сборку мусора поколений. Объекты создаются в пространстве eden, которое рассматривается как стек, так что объекты могут быть созданы очень быстро. Если они живут достаточно долго, объекты перемещаются в более долгоживущие поколения, и они реализуются больше как обычные динамически размещаемые кучи. JVM хранит классы и интернированные строки в куче «permspace». Permspace на самом деле не является постоянным: классы собираются, когда больше нет ссылок на их экземпляры или загрузчик классов. И, как указано выше, Java 6 выделит объект в стеке вызовов, если сможет определить, что ссылки на объект не покидают блок.

0 голосов
/ 11 ноября 2009

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

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

...