Каждый раз, когда я инициирую список в java, я буду делать
List<Integer> list = new LinkedList<>();
Я предполагаю, что это будет размещать список в куче. Интересно, есть ли способ разместить список в стеке?
Каждый раз, когда я инициирую список в java, я буду делать
List<Integer> list = new LinkedList<>();
Я предполагаю, что это будет размещать список в куче. Интересно, есть ли способ разместить список в стеке?
Все объекты, включая их индивидуальные атрибуты, хранятся в куче.
Все локальные переменные и их аргументы хранятся в стеке, поскольку они содержат примитивные значения или ссылки.
Однако в особых случаях виртуальная машина Java может выполнить анализ побега и принять решение о размещении объектов (включая ваш LinkedList
) в стеке, но обычно этого не происходит и это не является серьезной проблемой.
Как правило, если вы размещаете объект в стеке, вы получаете копию объекта при вызове функции, которая на него ссылается. Напротив, если вы выделяете объект в куче, при передаче указателя на объект вы получите копию указателя (который указывает на тот же самый объект в куче).
Теоретически реализации JVM могут размещать объекты в стеке, используя «анализ побега». Если можно определить, что ссылка на созданный объект никогда не утекает из стека, JVM может разместить ее в стеке, а не в куче. Преимущество этого будет заключаться в уменьшении накладных расходов на сборку мусора; при выходе из кадра стека эта память может быть немедленно освобождена. Это также может повысить скорость из-за локальности ссылки.
Начиная с Java 7, escape-анализ был представлен в среде выполнения Oracle HotSpot Java. Благодаря этому усовершенствованию HotSpot может не выделять локальные объекты стека, которые не были изменены; вместо того, чтобы размещать их в стеке, он полностью удаляет выделение. Хотя это не соответствует выделению стека, это демонстрирует, что такие вещи являются допустимыми оптимизациями во время выполнения.
Однако Java-программист не может напрямую управлять этим поведением. Это оптимизация, выполняемая JIT-компилятором. Я не уверен, что спецификация языка разрешает такую оптимизацию во время компиляции. Может быть, но я не изучал.
list
находится в стеке, однако это ссылка, а фактические объекты находятся в куче. - person Peter Lawrey   schedule 24.04.2014