IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

heap et stack


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Points : 514
    Points
    514
    Par défaut heap et stack
    Bonjour,

    Quelques questions concernant la heap et la stack

    La heap : Espace mémoire dans lequelle sont instancié les objets java

    La stack : une pile (donc LIFO) ou sont stockées les appels de méthodes et les variables locals au méthode ansi que les variables primitives.

    A partir du JDK 6 il y a une option "escape analysis" qui permet de mettre sur la stack les variables dont le contexte reste "interne" à la méthode.

    Je ne comprends pas assez bien le mécansisme sous-jacent pour expliquer le gain de performance. Les variables sur la stack occupe bien un espace mémoire, il faut les créer et les détruire au même titre que celles sur la heap. Je me trompe ?

    Merci pour vos lumiéres

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Quelques exemples :

    • Cela limite le nombre d'allocation/libération de mémoire, ce qui a un coût. En effet les données du stack sont alloué d'un bloc à l'entré de la méthode, puis libéré d'un bloc à sa sortie.

      En Java ceci est relativement moins important car le GC réserve lui-aussi la mémoire par bloc, et que l'instanciation d'un objet est moins onéreuse que l'allocation dynamique dans un langage natif, car cela n'implique pas forcément d'allocation/libération de mémoire auprès du système hôte.

    • Cela limite la durée d'utilisation de la mémoire, puisque l'objet est immédiatement libéré à la fin de la méthode.

      En C/C++ par exemple cela offre une plus grande simplicité d'utilisation (on ne risque pas les fuites mémoires).
      En Java cela permet surtout de décharger le GC de son travail : les objets instanciés dans le heap ne seront pas traité par le GC !

    • Les objets dans le stack ne peuvent pas être partagé entre plusieurs threads.

      Grâce à cela les processeurs peuvent optimiser l'accès aux données grâce à des instructions spécifiques...

    • Pour les mêmes raisons la synchronisation éventuelle de l'objet en devient complètement inutile, et peut être carrément ignoré par la JVM...



    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Points : 514
    Points
    514
    Par défaut
    Merci adiGuba pour tes réponses. C'est beaucoup plus clair.

    En regardant ta signature je vois que tu as fait un billet (http://blog.developpez.com/adiguba/p...cape-analysis/) sur la fonction "escape analysis". Très intéressant d'ailleurs.

    Une dernière question (concernant ton article) :

    la pile n'est utilisée que pour stocker les types primitifs et les références des paramètres et variables locales d'une méthode.
    Donc les paramétrés et variables locales sont alloués dans la heap et seul les références sont dans la stack. Ne pourrait t-on pas les allouer directement dans la stack ?

  4. #4
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Citation Envoyé par Shivan Voir le message
    Donc les paramétrés et variables locales sont alloués dans la heap et seul les références sont dans la stack. Ne pourrait t-on pas les allouer directement dans la stack ?
    C'est justement ce qui est fait avec "escape analysis" Ce sera en standard sur Java 7.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Points : 514
    Points
    514
    Par défaut
    merci Baptiste Wicht

    Allez encore une question... pourquoi on n'a pas utiliser la stack plus tôt pour ces cas de figure. y avait t-il un intérêt initial à utilisé la heap ?

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    En langage natif l'utilisation du stack induit une allocation mémoire bien différente de l'allocation dynamique qui se retrouve dans le code source. De même cela implique un passage des objets par copie (puisque la mémoire est libéré à la fin de la méthode).

    En Java l'allocation des objets est basé sur le modèle dynamique, couplé à un GC, et les objets sont passé par références (ce qui évites les copies inutiles).


    De ce fait l'utilisation du stack pour les objets est un peu plus complexe, et nécessite certaines conditions et traitements particulier lors de l'exécution...

    a++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Points : 514
    Points
    514
    Par défaut
    Ok tout est clair pour moi.

    Merci à vous 2 pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Différence d'adresse mémoire stack et heap
    Par easyquizz dans le forum C++
    Réponses: 16
    Dernier message: 29/01/2009, 22h26
  2. mise au point sur la new, class, stack et heap
    Par cdm1024 dans le forum C++
    Réponses: 1
    Dernier message: 18/03/2008, 15h21
  3. Stack, Free store, Heap etc
    Par buzzkaido dans le forum C++
    Réponses: 4
    Dernier message: 29/09/2007, 18h04
  4. Differences Stack et Heap
    Par elsargento dans le forum C++
    Réponses: 9
    Dernier message: 26/05/2004, 16h10
  5. Stack overflow
    Par portu dans le forum Langage
    Réponses: 3
    Dernier message: 26/11/2003, 15h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo