Ответ 1
Поскольку INVOKESPECIAL будет потреблять значение, созданное NEW из стека операндов, но вам может понадобиться фактически использовать это значение, поэтому ссылка дублируется заранее.
В настоящее время я просто в проекте, который использует java-байт-код. Обычно я вижу, что при создании нового экземпляра класса и вызове метода на нем байт-код будет выглядеть так:
NEW <MyClass>
DUP
INVOKESPECIAL <MyClass.<init>>
Вот почему нужно делать "DUP"? Из VM Spec я получаю описание "Дублировать верхнее значение в стеке операндов и нажимать дублируемое значение на стек операнда". Но зачем здесь дублировать верхнее значение стека операндов? Спасибо.
Поскольку INVOKESPECIAL будет потреблять значение, созданное NEW из стека операндов, но вам может понадобиться фактически использовать это значение, поэтому ссылка дублируется заранее.