Чем выполнение Java из кучи отличается от выполнения из стека c / c ++? - PullRequest
1 голос
/ 18 января 2012

В c / c ++ локальные объекты создаются в стеке, а данные передаются из стека в регистры процессора.

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

Мой вопрос: как программа перенаправляется из кучи в конечном итоге к выполнению?

Давайте предположим, что я запускаю функцию, которая копирует программный код в память после того, как программа находится в динамической памяти, и возвращает адрес точки входа в программу, как мне начать ее выполнение?

Ответы [ 3 ]

5 голосов
/ 19 января 2012

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

4 голосов
/ 19 января 2012

В Java нет стека

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

0 голосов
/ 19 января 2012

Если вы говорите о производительности кучи, то для Java это означает производительность ее сборщика мусора (GC), который зависит от его JIT (Just In Time) компилятора, который динамически переводит байтовые коды JVM в машинный код.

И GC может быть удивительно эффективным. Прочитайте хорошее руководство по сборке мусора , а также старую статью Эндрю Аппеля Сборка мусора может быть быстрее, чем выделение стека

Хорошо спроектированный GC - с хорошо спроектированным JIT - может распределять вещи очень быстро. GC, копирующий поколения, будет тратить небольшое количество времени на молодые живые объекты (так что мертвые молодые объекты по сути как бы распределяются «в массе» бесплатно)

...