Распределение памяти кучи и стека Java - PullRequest
5 голосов
/ 18 июня 2011
class Person{
          private String name;
          public Person(){
          }

          public Person(String name){
              this.name=name;
          }

          public static void main(String[] arg)
          {
                Person per= new Person("Andy");
          }
    }

per является локальной переменной, где она будет храниться, в куче или в стеке?

Ответы [ 2 ]

28 голосов
/ 18 июня 2011

Объекты всегда хранятся в куче .Тем не менее, ссылка до per будет сохранена в массиве локальных переменных , который хранится в фрейме , созданном для main(String[]), который сохраняетсяв стеке .

Для получения дополнительной информации см .: Структура виртуальной машины Java .

Редактировать: Я узнал, что JVM действительно могут размещать объекты в стеке , выполняя escape-анализ .Более того, можно применить технику, называемую скалярная замена , в которой выделение объекта опущено, а поля объекта обрабатываются как локальные переменные.Переменные могут быть размещены в машинных регистрах.

Анализ побега по распределению стека был реализован виртуальными машинами HotSpot начиная с Java 6u14.Он включен по умолчанию начиная с Java 6u23Чтобы объект был размещен в стеке, он не должен выходить из исполняющего потока, тела метода или передаваться в качестве аргумента другому методу.

0 голосов
/ 18 июня 2011

в куче.Каждый раз, когда вы используете new для создания объекта, он размещается в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...