Шта је меморија стека?
Стек у јави је одељак меморије који садржи методе, локалне променљиве и референтне променљиве. Стацк меморија се увек наводи у редоследу Ласт-Ин-Фирст-Оут. Локалне променљиве се креирају у стеку.
Шта је меморија гомиле?
Хеап је одељак меморије који садржи Објекте и који такође може садржати референтне променљиве. Променљиве инстанце креирају се у гомили
Додељивање меморије у Јави
Додељивање меморије у Јави је процес у којем се одељци виртуелне меморије одвајају у програму за чување променљивих и инстанци структура и класа. Међутим, меморија није додељена објекту при декларацији већ се креира само референца. За алокацију објекта у меморији користи се метода нев (), тако да се објекту увек додељује меморија на гомили.
Додељивање Јава меморије подељено је у следеће одељке:
- Гомила
- Гомила
- Код
- Статички
Ова подела меморије потребна је за њено ефикасно управљање.
- Код део садржи свој битецоде .
- Стацк дио меморије садржи метода, локалне променљиве и референтне променљиве.
- Хеап секција садржи објекте (такође могу садржати референтни променљивих).
- Статички део садржи статистичке податке / методе .
Разлика између локалне и инстанце променљиве
Променљива инстанце декларисана је унутар класе, али не и унутар методе
class Student{int num; // num is instance variablepublic void showData{}
Локална променљива су проглашени у , а методом, укључујући метода аргумената .
public void sum(int a){int x = int a + 3;// a , x are local variables;}
Разлика између стека и гомиле
Кликните овде ако видео снимку није доступан
Узмимо пример да бисмо ово боље разумели.
Узмите у обзир да је ваша главна метода која позива метод м1
public void m1{int x=20}
У стек јави, оквир ће бити креиран од методе м1.
Променљива Кс у м1 ће такође бити створена у оквиру за м1 у стеку. (Погледајте слику испод).
Метод м1 позива метод м2. У јацку стека креира се нови оквир за м2 на врху оквира м1.
Променљиве б и ц ће такође бити створене у оквиру м2 у стогу.
public void m2(int b){boolean c;}
Иста метода м2 позива методу м3. Поново се ствара оквир м3 на врху стека (погледајте слику испод).
Рецимо сада да наша метода м3 креира објекат за класу „Аццоунт“, која има две инстанце променљиве инт п и инт к.
Account {Int p;Int q;}
Ево шифре за методу м3
public void m3(){Account ref = new Account();// more code}
Извод нев Аццоунт () створиће објект рачуна у гомили.
Референтна променљива "реф" биће створена у стек јави.
Оператор доделе направиће референтну променљиву која ће усмерити на објекат у Купи.
Након што метода заврши своје извршавање. Ток контроле ће се вратити на метод позивања. Што је у овом случају метода м2.
Гомила из методе м3 ће бити испрана.
Будући да референтна променљива више неће показивати на објекат у гомили, била би подобна за сакупљање смећа.
Једном када метода м2 изврши своје извршавање. Биће искочен из стека, а све његове променљиве ће бити испране и више неће бити доступне за употребу.
Исто тако за методу м1.
На крају, ток контроле ће се вратити на почетну тачку програма. Што је обично „главна“ метода.
Шта ако Објецт има референцу као променљиву инстанце?
public static void main(String args[]) {A parent = new A(); //more code } class A{ B child = new B(); int e; //more code } class B{ int c; int d; //more code }
У овом случају, референтна променљива „дете“ биће створена у гомили, која ће заузврат указивати на свој објекат, нешто попут дијаграма приказаног доле.
Резиме:
- Када се метода позове, оквир се креира на врху стека.
- Једном када метода заврши извршење, ток контроле се враћа позивајућој методи и њен одговарајући оквир стека се испире.
- Локалне променљиве се креирају у стеку
- Променљиве инстанце креирају се у гомили и део су објекта којем припадају.
- Референтне променљиве креирају се у стеку.