Объркан с управлението на паметта на Java (стекове и купчини)

Това може да звучи глупаво, но все още не съм наясно с Java Stack и паметта. Това, което знам от следването е следното:

1) Всички извиквания на метод отиват в стека.

2) Цялата памет, разпределена локално, отива в паметта (не е много ясно по този въпрос)

3) Цялата памет, разпределена от нов оператор (или в метод, или в клас), отива в паметта.

Притеснявам се от следните случаи:

1) Ако създам int променлива в метод и я върна, къде отива (вярвам, че отива в стека, но има нужда от пояснение).

2) Ако създам нов обект в метод, той отива в паметта на купчината, тъй като съществува, дори след като изпълнението на методите приключи (разбирам, че това се случва, защото хеш кодът на обекта, създаден от java, остава същият, когато присвоя този обект на някои външна референтна променлива или връщам този обект).

3) Моят проблем е какво се случва, ако не присвоявам обекта, споменат в точка 2, на никаква препратка или не връщам това. Все още ли е създаден на куп? Логично би трябвало да е така, но моля да ме просветлите.


person dharam    schedule 17.05.2012    source източник


Отговори (2)


Всички параметри на метода отиват в стека. Всички локални променливи отиват в стека. Единственото нещо, което влиза в купчината, са неща, разпределени изрично с помощта на new (или имплицитно чрез автоматично боксиране или varargs.)

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

So:

1) - връщате примитивна стойност (не променлива!) и тя отива в стека. (Не можете да "върнете" променлива. Променливата е част от рамката на стека и не може да бъде отделена от нея.)

2) Да.

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


1 - всъщност най-новите компилатори на Hotspot са в състояние да открият, че референцията на обект никога не "избяга" от метода, който го създава, и че обектите могат да бъдат разпределени в стека. IIRC, тази оптимизация - наречена escape анализ - трябва да бъде активирана с помощта на JVM флаг на командния ред.

person Stephen C    schedule 17.05.2012
comment
Благодаря ви много..Доволен съм от отговора :) - person dharam; 17.05.2012

Кодов сегмент: Константните стойности често се поставят директно в програмния кодов сегмент.

Стек: Препратките към обекти и примитивните променливи се поставят в стека.

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

За вашите въпроси:

1) Да

2) Да

3) Да

person Don Li    schedule 17.05.2012