Java Где сделать локальные переменные, ссылки на объекты, переменные экземпляра - PullRequest
5 голосов
/ 21 декабря 2011

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

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

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

Ответы [ 2 ]

11 голосов
/ 21 декабря 2011

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

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

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

2 голосов
/ 06 июля 2012

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

...