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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. 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 main appelle f qui appelle g, la pile contient main, f, g de bas en haut. Quand g retourne, son cadre est retiré et f reprend.

  • 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);
    }
    `

    • 3
    • 1
    • 0
    • 2
    Voir la réponse

    3

    deplacer reçoit une copie de la référence : p.x += dx modifie l'objet du tas, que pt voit aussi, donc x vaut 3. Dans remettre, p = new Point(0) change seulement la variable locale du cadre, qui disparaît au retour : pt dé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éthode factorielle des 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.