6. Geheugenallocatie in Java Flashcards
In welke delen wordt het computergeheugen bij het uitvoeren verdeeld?
- Code segment
- Stack segment
- Heap segment
Wat is het code segment?
In dit segment wordt de gecompileerde programmacode van het programma bewaard.
Wat is het stack segment?
In dit segment wordt tijdelijke informatie van methode-oproepen bewaard, zoals bv een lokale variabele in een methode.
Wat is het heap segment?
In een heap segment wordt de data van objecten opgeslagen.
Deze data blijft in het geheugen zolang het programma loopt (of tot er garbage collection optreedt).
Wat zijn de kenmerken van een stack segment?
Het stack segment staat er voor bekend dat het zeer snel werkt,
eerder klein is en
werkt als een echte stack (LIFO).
Wat is een frame?
Bij een methode-oproep wordt een frame aangemaakt met informatie over de parameters,
de lokale variabelen,
het terugkeeradres naar het code segment en
het terugkeeradres naar het vorige frame (de vorige methode-oproep dus).
Wat is een register?
Een klein stukje snel geheugen.
Welke registers zijn er nodig om een methode-oproep op een goede manier te verwerken?
- Stack register (SR)
- Activatie register (AR)
Welke stappen worden er ondernomen om een frame te maken bij een methode-aanroep?
- De parameters van de methode worden op de stack gezet.
- De waarde van het vorige AR wordt op de stack gezet. Dit laat toe om later, wanneer de methode volledig uitgevoerd is, terug te keren naar de vorige methode-aanroep.
- De top van de stack wordt gekopieerd naar het AR. Op die manier kunnen we via het AR steeds het actieve frame raadplegen.
- Het terugkeeradres van het code segment wordt op de stack gezet. Dit laat toe om later, wanneer de methode volledig uitgevoerd is, in de code terug te keren naar de plaats waar de methode werd opgeroepen.
- De lokale variabelen van de methode worden op de stack gezet.
Welke stappen zijn er nodig voor het beëindigen van een methode-oproep?
Wanneer een methode volledig doorlopen werd, moeten we de stappen in omgekeerde volgorde weer doorlopen, zodat alle parameters en lokale variabelen weer worden vrijgegeven, en teruggekeerd kan worden naar de oproep in de code.
De stappen bij het beëindigen van een oproep zijn dus de volgende:
1. De lokale variabelen worden van de stack gehaald.
2. Het terugkeeradres van het code segment wordt van de stack gehaald om terug naar de
oproep van de methode te kunnen gaan.
3. De referentie naar het vorige frame wordt van de stapel gehaald en naar het AR gekopieerd.
Op die manier wordt het vorige frame weer actief.
4. De parameters worden van de stack gehaald.
Kan het stack segment variabelen bijhouden die verwijzen naar objecten?
Nee, het stack segment kan alleen maar variabelen bijhouden van het primitieve type; de hoeveelheid geheugen is op voorhand geweten bij primitieve types.
Wanneer de variabelen objecten zijn, kan de compiler niet weten hoeveel plaats ze zullen innemen tijdens de uitvoering en dus wordt de data van het object niet op de stack gezet, maar op de heap.
De variabele zelf wordt wel op de stack gezet en verwijst naar de plaats waar de data van het object in de heap staat.
Wat zijn de verschillende kenmerken tussen de stack en heap?
De heap is een stuk trager, maar wel veel groter.
Wat is garbage collection?
Java doet aan garbage collection wat betekent dat objecten waarnaar niet meer gerefereerd worden maar verwijderd worden op het moment dat de Java Virtual Machine vrije ruimte nodig heeft op de heap. Zolang dit niet het geval is, blijft het object eigenlijk bestaan (maar is het ontoegankelijk).
Wat is een stack register?
Deze register wijst naar de top van de stack.
Wat is een activatie register?
Deze register wijst naar het frame dat actief is.