Запутано с управлением памятью Java (стеки и кучи)
==================================================

Это может звучать глупо, но я до сих пор не понимаю, что такое стек Java и куча памяти. Из учебы я знаю следующее:

1) Все вызовы методов идут в стек.

2) Вся выделенная локально память уходит в кучу памяти (не очень понятно об этом пункте)

3) Вся память, выделенная новым оператором (либо в методе, либо в классе), уходит в кучу памяти.

Я беспокоюсь о следующих случаях:

1) Если я создаю переменную int в методе и возвращаю ее, куда она идет (я считаю, что она идет в стек, но требует пояснения).

2) Если я создаю новый объект в методе, он перемещается в кучную память, поскольку он существует даже после завершения выполнения методов (я понимаю, это происходит потому, что хеш-код объекта, созданного Java, остается тем же самым, когда я назначаю этот объект некоторым внешняя ссылочная переменная или я возвращаю этот объект).

3) Моя проблема в том, что происходит, если я не назначаю объект, упомянутый в пункте 2, какой-либо ссылке или не возвращаю это. Это все еще создано в куче? По логике это должно быть, но, пожалуйста, просветите меня.

 . Единственное, что попадает в кучу, это вещи, выделенные явно с помощью`new` (или неявно с помощью автобокса или varargs.)

 Другой способ думать о том, что примитивные значения и объект / массив**Ссылк** может идти в стек, но реальные объекты не могут1.

Так

 1) - вы возвращаете примитивное значение (не переменную!), И оно попадает в стек. (Вы не можете «вернуть» переменную. Переменная является частью фрейма стека и не может быть отсоединена от нее.)

 2) Да.

 3) Да, по крайней мере, сейчас1. В какой-то момент GC может запуститься, заметить, что приложение больше не имеет ссылки на объект, и вернуть его.

 1 - фактически, последние компиляторы Hotspot способны обнаруживать, что ссылка на объект никогда не «выходит» из метода, который его создает, и что объекты могут быть размещены в стеке. IIRC, эту оптимизацию, называемую анализом побега, необходимо включить с помощью флага командной строки JVM.



 постоянные значения часто помещаются непосредственно в сегмент кода программы.

Stack: ссылки на объекты и примитивные переменные помещаются в сте

Heap: при создании объекта хранилище выделяется в куче при выполнении этого кода.

 Для ваших вопросов:

 1) Да

 2) Да

 3) Да