Насколько я понимаю, на // POINT A - вы создали четыре
экземпляры MyObject. Эти четыре экземпляра живут в куче.
правый. Для каждого объекта выделена память в куче.
у вас есть четыре ссылки на эти экземпляры. ВОПРОС 1: Где они
жить?
Когда вы создавали объекты, вы присваивали (ссылку) каждому из них на отдельное поле объекта Foo
. Эти поля «живут» в памяти, выделенной для объекта Foo
, который также почти наверняка находится где-то в куче.
Насколько я понимаю, на // POINT B - вы создали новый
ссылка на «Альфа» с именем «o1». Эта ссылка добавлена и живет
в стеке. Когда метод возвращается, эта ссылка удаляется.
Да, в POINT B параметр o1
также хранит ссылку на MrObject
, который был передан в качестве аргумента. o1
живет в краткосрочном магазине, который, как правило, будет «стеком». Когда метод завершится, пространство в кратковременном хранилище, используемом для o1
, станет доступным для другого использования, и сборщик мусора больше не будет рассматривать o1
как известный живой корень.
у вас есть ссылка с именем 'o2'. ВОПРОС 2: Это новая ссылка
который добавляется и находится в стеке и ссылается на объект2
ссылка? Или 'o2' просто псевдоним, поддерживаемый в коде (а не в
памяти) и на самом деле в памяти есть только одна ссылка на
«Браво» называется «объект2» и когда этот код на самом деле выполняется,
«o2.foo» рассматривается как «object2.foo»?
А теперь мы переходим к сложной части вашего вопроса. o2
является ссылкой другого рода. Это не ссылка на объект в куче, а скорее псевдоним (как вы предполагаете) к полю object2
объекта Foo
. o2
все еще занимает место в краткосрочном хранилище, так как это все еще аргумент метода.
Кстати, тот факт, что в памяти есть "только одна ссылка на Bravo
", - это не то, о чем вам следует беспокоиться. Ссылки, которые достижимы от известных корней GC , определяют, можно ли безопасно собрать конкретный объект.