В Java есть разница в производительности между новым и локальным? - PullRequest
2 голосов
/ 18 марта 2011

В C и C ++ я знаю, что может быть огромная разница в производительности между созданием экземпляров объектов в стеке и использованием «new» для их создания в куче.

Это то же самое в Java?

Оператор 'new' в Java очень удобен (особенно когда мне не нужно помнить об освобождении / удалении объектов, созданных с помощью 'new'), но означает ли это, что я могу сойти с ума с помощью 'new'«

Ответы [ 6 ]

6 голосов
/ 18 марта 2011

В Java нет выделения объектов в стеке.

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

6 голосов
/ 18 марта 2011

Эмм, в Java нет другого способа создания экземпляра объекта.

Все объекты создаются с new, а все объекты создаются в куче.

в Java,когда вы говорите

MyObject foo;

Вы просто объявляете переменную (ссылку).Он не создается, пока вы не скажете

foo = new MyObject();

Когда все ссылки на этот объект находятся вне области видимости, объект становится гибким для сборки мусора.Вы заметите, что в java нет такой вещи, как delete:

5 голосов
/ 18 марта 2011

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

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

Частично причина того, что производительность и производительность не такие, как в C / C ++, заключается в том, что Java имеет локальное распределение потоков в куче, и объекты не перерабатываются так агрессивно. В C / C ++ есть локальные стеки потоков, но вам нужны дополнительные библиотеки для поддержки многопоточного выделения объектов. Объекты перерабатываются более агрессивно, что увеличивает стоимость размещения объектов.

Одним из самых больших изменений в мире C / C ++ является обнаружение того, что Java обладает гораздо меньшими возможностями, но старается максимально использовать их (в JVM происходит много сложной оптимизации) С другой стороны Java имеет богатый / сбивающий с толку массив библиотек с открытым исходным кодом.

3 голосов
/ 18 марта 2011

Повторяйте за мной: в Java нет выделения объектов в стеке

В Java, в отличие от C ++, все объекты размещаются в куче, и единственным выходом являетсякогда они собирают мусор.

В Java, в отличие от C ++, переменная , выходящая из области видимости, не означает, что деструктор объекта работает;на самом деле, нет деструктора.Таким образом, переменная может выпасть из области видимости, но объект остается живым в куче.

Можно ли сойти с ума с 'новым'?

Да.Во-первых, потому что это единственный способ создания объекта.Во-вторых, поскольку JVM настолько хороша, что может создать до 2 ^ 32 легких объектов менее чем за секунду.

1 голос
/ 18 марта 2011

В Java нет способа вручную разместить объекты в стеке, хотя компилятор может решить разместить объекты, созданные с помощью 'new' в стеке, см. Теория и практика Java: легенды о городской производительности, пересмотр .

0 голосов
/ 18 марта 2011

Здесь действительно нечего сравнивать: вы не можете создавать объекты в стеке в Java.

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

...