2011-12-21 4 views
5

В настоящее время я изучаю концепции памяти java, стека и кучи, я знаю, что локальные переменные и вызовы методов жили в месте, называемом стеком. и объекты жили внутри кучи. но что, если эта локальная переменная содержит объект? или имеет ссылку на объект?Java Где локальные переменные, ссылки на объекты, переменные экземпляра

public void Something(){ 
     Duck d = new Duck(24); 
} 

Он все еще живет внутри стека? и где живут переменные экземпляра? пожалуйста, держите его как можно проще. Спасибо.

ответ

11

Локальная переменная d (выделенная на стек) содержит ссылку на объект класса Duck. В общем случае объекты распределяются по куче.

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

Поля выделяются остальной частью объекта, поэтому на кучу или на стеке, в зависимости от результатов анализа бега.

+0

выделены внутри объекта, в котором они находятся? или как в соло в куче? – KyelJmD

+0

Что делать, если объект создается как переменная экземпляра, он все равно попадает под анализ Escape? – KyelJmD

+0

Макет объекта в памяти выглядит так: 8-байтовый заголовок, а затем атрибуты. Если переменная экземпляра является объектом, а не примитивом, тогда только указатель хранится в непрерывном блоке памяти, и объект может быть выделен в другом месте. – socha23

2

Работает ссылка на объект. точно так же, как примитивные переменные - если ссылка объявлена ​​как локальная переменная, она переходит в stack.else, если refrence является переменной экземпляра, она войдет в кучу внутри объекта.

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