Фактическое выделение памяти JVM и чем они отличаются? - PullRequest
3 голосов
/ 03 ноября 2011

Это может показаться большим количеством вопросов, но все они взаимосвязаны. Я немного запутался, как в том, где выделено пространство кучи и где расположена память стека?
Если оба присутствуют в основной памяти, то почему говорят, что стековая память легче доступна, и почему мы не можем размещать объекты в стековой памяти?
Так как классы хранятся в PermGen, где это место выделено и чем оно отличается от пространства кучи и где хранятся константы?

Ответы [ 2 ]

4 голосов
/ 03 ноября 2011
  1. "Где выделены куча и стек?" принятый ответ на этот вопрос покрывает это. Каждый поток получает свой собственный стек, и все они совместно используют одну кучу.Операционная система контролирует точное расположение в памяти стеков и элементов кучи, и оно варьируется.
  2. «Почему доступ к памяти стека проще» Каждый поток имеет свой собственный стек, поэтому проблем с параллелизмом меньше.И стек, и куча подходят для кэширования в частях L1, L2 и L3 иерархии памяти , поэтому я не согласен с ответом Даниэля здесь.На самом деле я бы не сказал, что доступ к одному виду памяти особенно прост, чем к другому.
  3. "Почему мы не можем размещать объекты в памяти стека?"Это проектное решение, принятое JVM.В других языках, таких как C / C ++, вы можете размещать объекты в стеке.Как только вы вернетесь из функции, которая выделила кадр стека , такие объекты будут потеряны.Распространенным источником ошибок в программах на C / C ++ является разделение указателя на такой объект, выделенный из стека.Могу поспорить, именно поэтому дизайнеры JVM сделали такой выбор, хотя я не уверен.
  4. PermGen - еще одна часть кучи.Постоянные строки хранятся здесь в течение всего срока службы JVM.Это мусор, как и остальная часть кучи.
2 голосов
/ 03 ноября 2011

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

Есть скорость доступа и скорость выделения. Распределение стека (как в alloca) происходит быстро, потому что нет необходимости искать неиспользуемый блок памяти. Но Java не разрешает выделение стека, если вы не учитываете выделение новых кадров стека.

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

и почему мы не можем размещать объекты в памяти стека?

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

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

Так как классы хранятся в PermGen, где это место выделено и чем оно отличается от пространства кучи и где хранятся постоянные строки?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...