Hukommelseshåndtering i Java
Hvad er Stack Memory?
Stack in java er en sektion af hukommelsen, som indeholder metoder, lokale variabler og referencevariabler. Der henvises altid til stakhukommelsen i Last-In-First-Out rækkefølge. Lokale variabler oprettes i stakken.
Hvad er Heap Memory?
Heap er en sektion af hukommelsen, som indeholder objekter og kan også indeholde referencevariabler. Forekomstvariabler oprettes i heapen.
Hukommelsestildeling ind Java
Hukommelsestildeling ind Java er den proces, hvor de virtuelle hukommelsessektioner sættes til side i et program til lagring af variabler og forekomster af strukturer og klasser. Hukommelsen er dog ikke allokeret til et objekt ved erklæringen, men kun en reference oprettes. Til hukommelsesallokering af objektet bruges new() metoden, så objektet er altid tildelt hukommelse på heapen.
Java Hukommelsesallokering er opdelt i følgende sektioner:
- bunke
- Stak
- Kode
- statisk
Denne opdeling af hukommelse er nødvendig for dens effektive styring.
- kode sektionen indeholder din bytekode.
- Stak sektion af hukommelsen indeholder metoder, lokale variabler og referencevariable.
- bunke afsnit indeholder Objekter (kan også indeholde referencevariabler).
- statisk afsnit indeholder Statiske data/metoder.
Forskellen mellem lokal og instansvariabel
Forekomstvariabel erklæres inde i en klasse, men ikke inde i en metode
class Student{ int num; // num is instance variable public void showData{}
Lokal variabel er erklæret indvendig a metode inklusiv metode argumenter.
public void sum(int a){ int x = int a + 3; // a , x are local variables; }
Forskellen mellem stak og heap
Klik link. hvis videoen ikke er tilgængelig
Lad os tage et eksempel for at forstå dette bedre. Overvej, at din hovedmetode kalder metode m1
public void m1{ int x=20 }
I stack java vil der blive oprettet en ramme fra metode m1.
Variablen X i m1 vil også blive oprettet i rammen for m1 i stakken. (Se billedet nedenfor).
Metode m1 kalder metode m2. I stack java oprettes en ny ramme til m2 oven på rammen m1.
Variable b og c vil også blive oprettet i en ramme m2 i en stak.
public void m2(int b){ boolean c; }
Samme metode m2 kalder metode m3. Igen oprettes en ramme m3 på toppen af stakken (se billedet nedenfor).
Lad os nu sige, at vores metode m3 opretter et objekt til klassen "Konto", som har to instanser variabel int p og int q.
Account { Int p; Int q; }
Her er koden til metode m3
public void m3(){ Account ref = new Account(); // more code }
Opgørelsen new Account() vil oprette et kontoobjekt i heap.
Referencevariablen "ref" vil blive oprettet i en stak java.
Tildelingen "="-operatoren vil lave en referencevariabel, der peger på objektet i Heapen.
Når metoden har afsluttet sin udførelse. Kontrolflowet vil gå tilbage til opkaldsmetoden. Hvilket i dette tilfælde er metode m2.
Stakken fra metode m3 vil blive skyllet ud.
Da referencevariablen ikke længere vil pege på objektet i dyngen, ville den være berettiget til affaldsindsamling.
Når metode m2 har afsluttet sin udførelse. Det vil blive poppet ud af stakken, og alle dets variable vil blive skyllet ud og ikke længere være tilgængelige til brug.
Ligeledes for metode m1.
Til sidst vil kontrolstrømmen vende tilbage til programmets startpunkt. Som normalt er "hovedmetoden".
Hvad hvis objektet har en reference som sin instansvariabel?
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 }
I dette tilfælde vil referencevariablen "child" blive oprettet i heap, som igen vil pege på sit objekt, noget som diagrammet vist nedenfor.
Hvad er Garbage Collection i Java?
Affaldsopsamling i Java er en proces, hvorved programmerne udfører hukommelsesstyring automatisk. Garbage Collector (GC) finder de ubrugte objekter og sletter dem for at genvinde hukommelsen. I Java, dynamisk hukommelsesallokering af objekter opnås ved hjælp af den nye operator, der bruger noget hukommelse, og hukommelsen forbliver allokeret, indtil der er referencer til brugen af objektet.
Når der ikke er nogen referencer til et objekt, antages det, at det ikke længere er nødvendigt, og den hukommelse, som objektet optager, kan genvindes. Der er ikke noget eksplicit behov for at ødelægge en genstand som Java håndterer deallokeringen automatisk.
Teknikken, der opnår dette, er kendt som Dagrenovation. Programmer, der ikke de-allokerer hukommelse, kan i sidste ende gå ned, når der ikke er nogen hukommelse tilbage i systemet at allokere. Disse programmer siges at have hukommelseslækager. Affaldsindsamling i Java sker automatisk i løbet af programmets levetid, hvilket eliminerer behovet for at deallokere hukommelse og derved undgå hukommelseslækager.
I C-sprog er det programmørens ansvar at de-allokere hukommelse tildelt dynamisk ved hjælp af free()-funktionen. Det er her Java hukommelseshåndteringsledninger.
Bemærk: Alle objekter er oprettet i Heap Sektion af hukommelsen. Mere om dette i en senere tutorial.
Eksempel: At lære affaldsopsamlermekanisme i Java
Trin 1) Kopier følgende kode ind i en 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(); } }
Trin 2) Gem, kompilér og kør koden. Som vist i diagrammet oprettes to objekter og to referencevariable.
Trin 3) Fjern kommentar linje # 20,21,22. Gem, kompilér og kør koden.
Trin 4) Som vist i diagrammet nedenfor, peger to referencevariabler på det samme objekt.
Trin 5) Fjern kommentar linje # 23 & 24. Kompiler, gem og kør koden
Trin 6) Som vist i diagrammet nedenfor bliver s2 null, men s3 peger stadig på objektet og er ikke berettiget til java-skraldeindsamling.
Trin 7) Fjern kommentar linje # 25 & 26. Gem, kompilér & kør koden
Trin 8) På dette tidspunkt er der ingen referencer, der peger på objektet og bliver berettiget til affaldsindsamling. Det vil blive fjernet fra hukommelsen, og der er ingen måde at hente det tilbage.
Sådan sletter du et objekt i Java?
1) Hvis du ønsker at gøre dit objekt kvalificeret til Garbage Collection, skal du tildele dens referencevariabel til null.
2) Primitive typer er ikke objekter. De kan ikke tildeles null.
Sammendrag:
- Når en metode kaldes, oprettes en ramme på toppen af stakken.
- Når en metode har afsluttet eksekveringen, vender kontrolstrømmen tilbage til den kaldende metode, og dens tilsvarende stackramme tømmes.
- Lokale variabler oprettes i stakken
- Forekomstvariabler oprettes i heapen og er en del af det objekt, de tilhører.
- Referencevariabler oprettes i stakken.