2013-04-11 5 views
1

Когда метод вызывается, JVM знает, сколько места выделяется для него.Что происходит в стеке во время цикла?

Но если у меня есть такой код:

while(someCondition) { 
    Path p = someMethodThatReturnsAPath(); 
    //do some things 
} 

, что происходит на стеке? Является ли это то, что happends ?:

  • Список создает указатель на стек, который указывает на (указатель, который указывает на путь, который возвращается из метода)
  • некоторый материал делается
  • р, или «указатель на указатель на объект Path» удаляются из стека
  • повтора

будет ли какое-либо (даже если это крошечная) разница в производительности между кодом выше и:

Path p = null; 
while(someCondition) { 
    p = someMethodThatReturnsAPath(); 
    //do some things 
} 
+0

Вы забыли о оптимизаторе. – SLaks

ответ

1

зависит от цели. Если вы отключите Hotspot, тогда может быть небольшая разница в производительности, и все будет вести себя так, как вы ожидаете выше. При использовании Hotspot тогда современные JVM обычно используют многоуровневый набор компиляторов для оптимизации кода «на лету». Как правило, JVM начинает интерпретироваться, а затем после стольких итераций метода (включая циклы внутри метода) метод будет оптимизирован в фоновом потоке и в какой-то момент заменен интерпретируемой версией. Затем на других триггерах может появиться больше оптимизаций или их нужно вернуть из-за новой информации. Вы можете обнаружить, что вызов метода в цикле полностью исчезает, если JVM может доказать, что он не работает и не имеет побочных эффектов, или цикл может разворачиваться.

Хороший способ рассказать, что происходит, это добавить несколько флагов JVM. Следующие флагов расскажут вам, когда оптимизируется метод -XX: + PrintCompilation (и здесь описано здесь https://gist.github.com/rednaxelafx/1165804#file_notes.md) и -XX: + UnlockDiagnosticVMOptions -XX: + PrintAssembly предоставит вам код ассемблера, который генерируется как компиляторы C1 и C2 введите

0

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

Таким образом, указатель никогда не удаляется из стека. Слот стека может повторно использоваться последующим объявлением вне области внутреннего блока: это совсем другое.

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

+0

Просто интересно .. Это хотя бы медленнее? Он должен найти новый слот стека для указателя на каждый цикл? – user1021085

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