Managementul memoriei în Java
Ce este memoria stivă?
Stiva în java este o secțiune a memoriei care conține metode, variabile locale și variabile de referință. Memoria stivă este întotdeauna referită în ordinea Last-In-First-Out. Variabilele locale sunt create în stivă.
Ce este Heap Memory?
Heap este o secțiune de memorie care conține obiecte și poate conține, de asemenea, variabile de referință. Variabilele de instanță sunt create în heap.
Alocarea memoriei în Java
Alocarea memoriei în Java este procesul în care secțiunile de memorie virtuală sunt puse deoparte într-un program pentru stocarea variabilelor și instanțelor structurilor și claselor. Cu toate acestea, memoria nu este alocată unui obiect la declarare, ci este creată doar o referință. Pentru alocarea memoriei obiectului, se folosește metoda new(), astfel încât obiectului i se alocă întotdeauna memorie pe heap.
Java Alocarea memoriei este împărțită în următoarele secțiuni:
- movilă
- Stivui
- Cod
- Static
Această împărțire a memoriei este necesară pentru gestionarea ei eficientă.
- cod secțiunea conține dvs cod octet.
- Stivui secțiunea de memorie conține metode, variabile locale și variabile de referință.
- movilă secțiunea conține Obiecte (poate conține și variabile de referință).
- Static secțiunea conține Date/metode statice.
Diferența dintre variabila locală și variabila de instanță
Variabila de instanta este declarat în interiorul unei clase, dar nu în interiorul unei metode
class Student{ int num; // num is instance variable public void showData{}
Variabilă locală sunt declarate în interiorul a metoda inclusiv metodă argumente.
public void sum(int a){ int x = int a + 3; // a , x are local variables; }
Diferența dintre stack și heap
Clic aici dacă videoclipul nu este accesibil
Să luăm un exemplu pentru a înțelege mai bine acest lucru. Luați în considerare că metoda dvs. principală apelând metoda m1
public void m1{ int x=20 }
În stiva java, un cadru va fi creat din metoda m1.
Variabila X în m1 va fi creată și în cadrul pentru m1 din stivă. (Vezi imaginea de mai jos).
Metoda m1 apelează la metoda m2. În stiva java, un nou cadru este creat pentru m2 deasupra cadrului m1.
Variabilele b și c vor fi, de asemenea, create într-un cadru m2 într-o stivă.
public void m2(int b){ boolean c; }
Aceeași metodă m2 apelează metoda m3. Din nou, un cadru m3 este creat în partea de sus a stivei (vezi imaginea de mai jos).
Acum să presupunem că metoda noastră m3 creează un obiect pentru clasa „Cont”, care are două variabilă de instanțe int p și int q.
Account { Int p; Int q; }
Aici este codul pentru metoda m3
public void m3(){ Account ref = new Account(); // more code }
Extrasul new Account() va crea un obiect de cont în heap.
Variabila de referință „ref” va fi creată într-o stivă java.
Operatorul de atribuire „=" va face o variabilă de referință pentru a indica obiectul din Heap.
Odată ce metoda și-a încheiat execuția. Fluxul de control va reveni la metoda de apelare. Care în acest caz este metoda m2.
Stiva de la metoda m3 va fi eliminată.
Deoarece variabila de referință nu va mai indica obiectul din heap, ar fi eligibilă pentru colectarea gunoiului.
Odată ce metoda m2 și-a încheiat execuția. Acesta va fi scos din stivă și toate variabilele sale vor fi eliminate și nu vor mai fi disponibile pentru utilizare.
La fel și pentru metoda m1.
În cele din urmă, fluxul de control va reveni la punctul de început al programului. Care, de obicei, este metoda „principală”.
Ce se întâmplă dacă Object are o referință ca variabilă de instanță?
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 }
În acest caz, variabila de referință „copil” va fi creată în heap, care, la rândul său, va indica obiectul său, ceva asemănător cu diagrama prezentată mai jos.
În ce este colectarea gunoiului Java?
Colectarea gunoiului în Java este un proces prin care programele efectuează automat gestionarea memoriei. Garbage Collector (GC) găsește obiectele neutilizate și le șterge pentru a recupera memoria. În Java, alocarea dinamică a memoriei obiectelor se realizează folosind noul operator care folosește o parte de memorie și memoria rămâne alocată până când există referințe pentru utilizarea obiectului.
Când nu există referințe la un obiect, se presupune că acesta nu mai este necesar, iar memoria, ocupată de obiect poate fi recuperată. Nu este nevoie explicită de a distruge un obiect ca Java gestionează automat dezalocarea.
Tehnica care realizează acest lucru este cunoscută ca Colecția de gunoi. Programele care nu de-aloca memoria se pot prăbuși în cele din urmă atunci când nu mai există memorie de alocat în sistem. Se spune că aceste programe au scurgeri de memorie. Colectarea gunoiului în Java se întâmplă automat pe durata de viață a programului, eliminând nevoia de de-alocare a memoriei și evitând astfel pierderile de memorie.
În limbajul C, este responsabilitatea programatorului de a dezaloca memoria alocată dinamic folosind funcția free(). Aici este locul Java conduce de gestionare a memoriei.
Notă: Toate obiectele sunt create în secțiunea Heap a memoriei. Mai multe despre asta într-un tutorial ulterior.
Exemplu: Pentru a învăța mecanismul de colectare a gunoiului în Java
Pas 1) Copiați următorul cod într-un editor.
class Student{ int a; int b; public void setData(int c,int d){ a=c; b=d; } public void showData(){ System.out.println("Value of a = "+a); System.out.println("Value of b = "+b); } public static void main(String args[]){ Student s1 = new Student(); Student s2 = new Student(); s1.setData(1,2); s2.setData(3,4); s1.showData(); s2.showData(); //Student s3; //s3=s2; //s3.showData(); //s2=null; //s3.showData(); //s3=null; //s3.showData(); } }
Pas 2) Salvați, compilați și rulați codul. După cum se arată în diagramă, sunt create două obiecte și două variabile de referință.
Pas 3) Descomentați rândul # 20,21,22. Salvați, compilați și rulați codul.
Pas 4) După cum se arată în diagrama de mai jos, două variabile de referință indică același obiect.
Pas 5) Decomentați rândurile # 23 și 24. Compilați, salvați și rulați codul
Pas 6) După cum se arată în diagrama de mai jos, s2 devine nul, dar s3 indică în continuare obiectul și nu este eligibil pentru colectarea gunoiului java.
Pas 7) Decomentați rândurile # 25 și 26. Salvați, compilați și rulați codul
Pas 8) În acest moment, nu există referințe care să indice obiectul și devine eligibil pentru colectarea gunoiului. Acesta va fi eliminat din memorie și nu există nicio modalitate de a-l recupera înapoi.
Cum să ștergeți un obiect în Java?
1) Dacă doriți să faceți obiectul dvs. eligibil pentru Garbage Collection, atribuiți variabilei sale de referință la null.
2) Tipurile primitive nu sunt obiecte. Ele nu pot fi atribuite nul.
Rezumat:
- Când este apelată o metodă, se creează un cadru în partea de sus a stivei.
- Odată ce o metodă a finalizat execuția, fluxul de control revine la metoda de apelare și cadrul de stivă corespunzător este șters.
- Variabilele locale sunt create în stivă
- Variabilele de instanță sunt create în heap și fac parte din obiectul căruia îi aparțin.
- Variabilele de referință sunt create în stivă.