В Java Могут ли объекты быть созданы как с статическим распределением памяти, так и с динамическим распределением памяти? - PullRequest
2 голосов
/ 30 августа 2009

В Java Могут ли объекты создаваться как с статическим, так и с динамическим распределением памяти?

Ответы [ 4 ]

2 голосов
/ 30 августа 2009

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

Редактировать: Я до сих пор не уверен, что под динамическими и статическими вы подразумеваете кучу и стек соответственно, но обычно это вопрос, возникающий у людей с фоном C / C ++, потому что эти языки дают разработчику контроль над что.

В Java, когда вы делаете типичный:

 Object o = new Object();

Это выделит память в куче. Если внутри метода вы делаете:

 int i = 1;

Затем это int выделяется в стеке (если это поле в классе, то оно будет размещено в куче).

0 голосов
/ 31 августа 2009

«Статический» не означает «в стеке».

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

Теоретически вы могли бы написать java-программу, используя только такие выделения, и она была бы статически распределенной , так же, как программа на C, которая никогда не вызывала malloc, просто имела фиксированные буферы для материала, который она хотел сделать.

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

Он просто, если правильно написано, выдаст много сообщений об ошибках, говорящих «Я не могу этого сделать».

0 голосов
/ 30 августа 2009

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

JVM могут выполнить escape-анализ , чтобы определить, будут ли объекты всегда ограничиваться одним потоком и что время жизни объекта ограничено временем жизни данного стекового фрейма. Если он может определить, что объект может быть размещен в стеке, JVM может выделить его там.

Подробнее см. в этой статье .

0 голосов
/ 30 августа 2009

Вся память экземпляра (вызывая new) выделяется в куче, все параметры выделяются в стеке. Но все java (не примитивные) параметры передаются по ссылке (исключая примитивы).

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