Pile et tas
Les deux zones de mémoire d'un programme objet : la pile, avec un cadre par appel, et le tas, où vivent les objets créés par new. Les références de l'une vers l'autre, la durée de vie et le débordement.
- 25 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
Quelques cartes du deck
Pile d'exécution : de quoi s'agit-il ?
Voir la réponse
Zone de mémoire où s'empilent les cadres des méthodes en cours d'exécution, la plus récemment appelée au sommet.
Quand
mainappellefqui appelleg, la pile contientmain,f,gde bas en haut. Quandgretourne, son cadre est retiré etfreprend.Qu'affiche ce programme ?
```java
static void deplacer(Point p, int dx) {
p.x += dx;
}
static void remettre(Point p) {
p = new Point(0);
}
public static void main(String[] args) {
Point pt = new Point(1);
deplacer(pt, 2);
remettre(pt);
System.out.println(pt.x);
}`3102
Voir la réponse
3deplacerreçoit une copie de la référence :p.x += dxmodifie l'objet du tas, queptvoit aussi, doncxvaut 3. Dansremettre,p = new Point(0)change seulement la variable locale du cadre, qui disparaît au retour :ptdésigne toujours l'ancien objet.Chaque appel de méthode empile un … qui contient les paramètres et les variables locales ; il est dépilé quand la méthode ….
Voir la réponse
Chaque appel de méthode empile un cadre qui contient les paramètres et les variables locales ; il est dépilé quand la méthode retourne.
Empiler et dépiler suit l'ordre des appels : le dernier appelé est le premier terminé. C'est ce qui rend la récursion possible.
Cadre d'appel : de quoi s'agit-il ?
Voir la réponse
Zone de la pile propre à un appel de méthode, qui porte ses paramètres et ses variables locales.
Chaque appel a son cadre, même pour une méthode qui s'appelle elle-même : les variables locales de deux appels récursifs sont distinctes. Le cadre disparaît au retour, et ses variables avec lui.
Un programme s'arrête avec
java.lang.StackOverflowError, la trace montrant la même méthodefactorielledes centaines de fois. Quelle est la cause ?- Des appels récursifs qui ne se terminent jamais, faute de cas d'arrêt
- Le tas est plein : trop d'objets ont été créés
- Une variable locale a dépassé la valeur maximale d'un
int - Le ramasse-miettes n'a pas libéré les cadres de la pile
Voir la réponse
Des appels récursifs qui ne se terminent jamais, faute de cas d'arrêt
La trace répétée montre des cadres qui s'accumulent. Les cadres ne dépendent pas du ramasse-miettes (ils sont retirés au retour), et un tas plein donne une autre erreur,
OutOfMemoryError.