2009-08-30 4 views
2

В java Можно создавать объекты с как распределением статической памяти, так и динамическим распределением памяти?В java Можно создавать объекты с фиксированным распределением памяти и распределением динамической памяти?

+2

Что конкретно вы подразумеваете под «статическим» и «динамическим» распределением памяти? – nos

ответ

2

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

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

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

Object o = new Object(); 

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

int i = 1; 

Тогда что ИНТ выделяется в стеке (если это поле в классе, то она будет выделена в куче).

+0

Можете ли вы привести пример как статического, так и динамического распределения как? – 2009-08-30 18:52:18

0

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

+2

В Java все параметры передаются по значению. –

+2

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

+1

. Точно, Java всегда имеет значение pass-by-value, что означает, что ссылки на объекты передаются по значению (а в Java-объектах всегда доступ через ссылку). Это полностью отличается от пропусков. Http: // StackOverflow.com/questions/40480/is-java-pass-by-reference –

-1

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

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

Для получения более подробной информации см. this article.

+1

Java 6u14 (когда включен -XX: + DoEscapeAnalysis включен) использует escape-анализ для скалярной замены, а не для распределения стека. Объекты * никогда * не выделяются в стеке, но их поля встроены и рассматриваются как локальные переменные. См. Http://java.sun.com/javase/6/webnotes/6u14.html. –

0

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

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

Вы могли бы теоретически написать программу Java, используя только такие распределения, и это будет statically allocated, то же самое, что и программа на языке C, которая никогда не называлась malloc, просто имела фиксированные буферы для того, что она хотела сделать.

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

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

Смежные вопросы