Локальная переменная d
(размещена в стеке) содержит ссылку на объект класса Duck
.В общем случае объекты размещаются в куче.
В Java 6e14 добавлена поддержка так называемого «escape-анализа».Если вы включите его с помощью переключателя -XX:+DoEscapeAnalysis
, то, если JVM определит, что объект создан в методе, используется только в этом методе, и для ссылки на объект не существует способа «экранировать» этот метод - то есть мы можемубедитесь, что на объект не ссылаются после завершения метода - JVM может разместить его в стеке (обрабатывая все его поля, как если бы они были локальными переменными).Это может произойти в вашем примере.
Поля выделяются с остальной частью объекта, так что в куче или в стеке, в зависимости от результатов анализа escape.