Minnehåndtering i Java
Hva er Stack Memory?
Stack in java er en del av minnet som inneholder metoder, lokale variabler og referansevariabler. Stabelminne refereres alltid til i Sist-inn-først-ut-rekkefølgen. Lokale variabler opprettes i stabelen.
Hva er Heap Memory?
Heap er en del av minnet som inneholder objekter og kan også inneholde referansevariabler. Forekomstvariabler opprettes i heapen.
Minnetildeling inn Java
Minnetildeling inn Java er prosessen der de virtuelle minneseksjonene settes til side i et program for lagring av variabler og forekomster av strukturer og klasser. Minnet blir imidlertid ikke allokert til et objekt ved deklarering, men bare en referanse opprettes. For minneallokering av objektet brukes new()-metoden, slik at objektet alltid tildeles minne på heapen.
Ocuco Java Minnetildeling er delt inn i følgende seksjoner:
- heap
- Stable
- Kode
- Statisk
Denne inndelingen av minne er nødvendig for effektiv styring.
- Ocuco kode delen inneholder din Bytecode.
- Ocuco Stable del av minnet inneholder metoder, lokale variabler og referansevariabler.
- Ocuco heap delen inneholder Objekter (kan også inneholde referansevariabler).
- Ocuco Statisk delen inneholder Statiske data/metoder.
Forskjellen mellom lokal og forekomstvariabel
Forekomstvariabel blir erklært inne i en klasse, men ikke i en metode
class Student{
int num; // num is instance variable
public void showData{}
Lokal variabel er erklært innsiden a metode inkludert metode argumenter.
public void sum(int a){
int x = int a + 3;
// a , x are local variables;
}
Forskjellen mellom Stack og Heap
Klikk her. hvis videoen ikke er tilgjengelig
La oss ta et eksempel for å forstå dette bedre. Tenk på at hovedmetoden kaller metoden m1
public void m1{
int x=20
}
I stack-javaen vil det bli laget en ramme fra metoden m1.
Variabelen X i m1 vil også bli opprettet i rammen for m1 i stabelen. (Se bildet nedenfor).
Metode m1 kaller metode m2. I stack java opprettes en ny ramme for m2 på toppen av rammen m1.
Variable b og c vil også bli opprettet i en ramme m2 i en stabel.
public void m2(int b){
boolean c;
}
Samme metode m2 kaller metode m3. Igjen lages en ramme m3 på toppen av stabelen (se bildet nedenfor).
La oss nå si at metoden vår m3 oppretter et objekt for klassen "Konto", som har to forekomstvariabel int p og int q.
Account {
Int p;
Int q;
}
Her er koden for metode m3
public void m3(){
Account ref = new Account();
// more code
}
Utskriften new Account() vil opprette et kontoobjekt i haug.
Referansevariabelen "ref" vil bli opprettet i en stack-java.
Tildelingen "="-operatoren vil lage en referansevariabel for å peke på objektet i heapen.
Når metoden er fullført. Kontrollflyten vil gå tilbake til anropsmetoden. Som i dette tilfellet er metode m2.
Stabelen fra metode m3 vil spyles ut.
Siden referansevariabelen ikke lenger vil peke til objektet i haugen, vil den være kvalifisert for søppelinnsamling.
Når metoden m2 har fullført utførelsen. Den vil bli spratt ut av stabelen, og alle variablene vil bli tømt og ikke lenger være tilgjengelige for bruk.
Likeledes for metode m1.
Etter hvert vil kontrollflyten gå tilbake til programmets startpunkt. Som vanligvis er "hovedmetoden".
Hva om objektet har en referanse som 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 tilfellet vil referansevariabelen "barn" bli opprettet i haug, som igjen vil peke på objektet, noe som diagrammet vist nedenfor.
Hva er Garbage Collection i Java?
Søppeloppsamling i Java er en prosess der programmene utfører minnebehandling automatisk. Garbage Collector (GC) finner de ubrukte gjenstandene og sletter dem for å gjenvinne minnet. I Java, dynamisk minneallokering av objekter oppnås ved å bruke den nye operatoren som bruker noe minne og minnet forblir allokert til det er referanser for bruken av objektet.
Når det ikke er noen referanser til et objekt, antas det at det ikke lenger er nødvendig, og minnet som er okkupert av objektet kan gjenvinnes. Det er ikke noe eksplisitt behov for å ødelegge et objekt som Java håndterer deallokeringen automatisk.
Teknikken som oppnår dette er kjent som Søppelsamling. Programmer som ikke de-allokerer minne kan til slutt krasje når det ikke er noe minne igjen i systemet å tildele. Disse programmene sies å ha minnelekkasjer. Søppelhenting inn Java skjer automatisk i løpet av programmets levetid, og eliminerer behovet for å deallokere minne og dermed unngå minnelekkasjer.
I C-språket er det programmererens ansvar å de-allokere minne som er tildelt dynamisk ved hjelp av free()-funksjonen. Det er her Java minnehåndteringsledninger.
OBS: Alle objekter er opprettet i heap-delen av minnet. Mer om dette i en senere opplæring.
Eksempel: Å lære søppeloppsamlermekanismen i Java
Trinn 1) Kopier følgende kode inn 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();
}
}
Trinn 2) Lagre, kompiler og kjør koden. Som vist i diagrammet opprettes to objekter og to referansevariabler.
Trinn 3) Ikke kommenter linje # 20,21,22. Lagre, kompiler og kjør koden.
Trinn 4) Som vist i diagrammet nedenfor, peker to referansevariabler til samme objekt.
Trinn 5) Fjern kommenter linje 23 og 24. Kompiler, lagre og kjør koden
Trinn 6) Som vist i diagrammet nedenfor, blir s2 null, men s3 peker fortsatt til objektet og er ikke kvalifisert for java søppelinnsamling.
Trinn 7) Fjern kommentar linje 25 og 26. Lagre, kompiler og kjør koden
Trinn 8) På dette tidspunktet er det ingen referanser som peker på objektet og blir kvalifisert for søppelhenting. Det vil bli fjernet fra minnet, og det er ingen måte å hente det tilbake.
Hvordan slette et objekt i Java?
1) Hvis du ønsker å gjøre objektet ditt kvalifisert for Garbage Collection, tilordne dets referansevariabel til null.
2) Primitive typer er ikke objekter. De kan ikke tilordnes null.
Sammendrag:
- Når en metode kalles, opprettes en ramme på toppen av stabelen.
- Når en metode har fullført utførelse, går kontrollflyten tilbake til anropsmetoden og dens korresponderende stabelramme tømmes.
- Lokale variabler opprettes i stabelen
- Forekomstvariabler opprettes i heapen og er en del av objektet de tilhører.
- Referansevariabler opprettes i stabelen.



















