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

avec Java Discussion :

Dépassement de pile. Mais quelle est sa taille ?


Sujet :

avec Java

  1. #1
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut Dépassement de pile. Mais quelle est sa taille ?
    Bonjour

    Je programmais joyeusement dans la douceur de ces fêtes de fin d'année quand je me suis rendu compte que mon programme, qui marchait pour un tableau de 20x14 (celui utilisé par défaut), plantait pour un tableau de 30x25. "Dépassement de pile" qu'il disait.

    Mais je m'étonne.
    D'abord, le problème n'est pas un problème de réservation mémoire. C'est bien un problème de récursivité trop poussée. Trop d'appels de fonctions imbriquées. Seulement, pour une grille XxY, il y a 8XY+6(X+Y)+5 éléments qui s'interpellent.
    Pour une grille 20x14, 2049 éléments.
    Pour une grille 30x25, 6335 éléments.

    D'où ma question: Quelle est la taille de la pile ? Est-il normal qu'elle sature avec, environ, 7000 appels de méthodes imbriqués?


    ps: Chaque objet alerte ses voisins qui, s'ils ne sont pas au courant, alertent leur propres voisins. Comme la récursivité s'arrête quand tout le monde est au courant, il n'y a pas plus de 7000 appels de fonctions. Cependant, y a t il une autre méthode ?

    pps:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
            at sun.nio.cs.SingleByteEncoder.encodeArrayLoop(Unknown Source)
            at sun.nio.cs.SingleByteEncoder.encodeLoop(Unknown Source)
            at java.nio.charset.CharsetEncoder.encode(Unknown Source)
            at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
            at sun.nio.cs.StreamEncoder.write(Unknown Source)
            at java.io.OutputStreamWriter.write(Unknown Source)
            at java.io.BufferedWriter.flushBuffer(Unknown Source)
            at java.io.PrintStream.write(Unknown Source)
            at java.io.PrintStream.print(Unknown Source)
            at java.io.PrintStream.println(Unknown Source)
            at MonObjet.alerteGenerale(Grille.java:27)
            at AutreObjet.alerteVoisins(Grille.java:76)
            at MonObjet.alerteGenerale(Grille.java:33)
            at EncoreUnAutreObjet.alerteVoisins(Grille.java:272)
            at MonObjet.alerteGenerale(Grille.java:33)
            at AutreObjet.alerteVoisins(Grille.java:77)
            at MonObjet.alerteGenerale(Grille.java:33)
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    Salut,
    Tu as bien raison, il s'agit d'un problème de récursivité.
    Pour ne plus avoir le problème, tu peux augmenter le "Xss" pour la "stack size".
    Au fait, par défaut, la taille de la stack est de 512 Kb.
    Enjoy !

    ____________________
    http://blog.ostyn.fr

  3. #3
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 552
    Points : 15 463
    Points
    15 463
    Par défaut
    En effet la récursivité trop profonde est typiquement le genre problème qui conduit à un épuisement du stack. 7000 appels récursif, ça commence à faire pas mal, surtout si tu as beaucoup de variables sur le stack.

    Je ne connais pas la taille exacte du stack et je crois qu'elle n'est pas fixée dans les specs de java. Il est cependant possible de créer un Thread en spécifiant la taille du stack souhaitée: http://java.sun.com/javase/6/docs/ap...tring,%20long)) . Bien sur si la plateforme impose une taille fixe, la JVM peut ignorer le paramètre.
    Enfin tu peux spécifier la taille du stack via le paramètre -Xss<size> de la commande java

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Merci pour vos réponses

    Citation Envoyé par francoisostyn Voir le message
    Au fait, par défaut, la taille de la stack est de 512 Kb.
    Ne veux tu pas dire 512 KB ou 512ko ?

    Cette taille de toute façon me laisse perplexe. C'est peu.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 43
    Points : 48
    Points
    48
    Par défaut
    Ah excuse, je me suis trompé.
    En effet, tout dépend de l'OS et de l'archi processeur...
    Voici les tailles par défaut de la thread stack size :

    Windows x86 : 64 KB
    Linux x86 :128 KB
    Windows IA64 : 320 KB
    Linux IA64 : 1024 KB
    Solaris Sparc : 256 KB

    Alors si c'est trop peu, il faut voir avec Sun mais il ne faut pas oublier que c'est alloué pour chaque Thread et quand tu vois combien on peut en avoir sur les serveurs d'applications, c'est tout de même pas mal.
    Mais comme dans tout paramétrage de la JVM, si tu alloues trop de mémoire, les performances risquent se dégrader... Donc, à méditer...

    ______________
    http://blog.ostyn.fr

  6. #6
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Merci pour la précision de tes réponses. Je marque le sujet résolu, même si mon problème persiste.

    Je n'irais pas voir Sun.
    Si les programmes commençaient à planter dès le traitement d'un tableau aussi petit, y aurait du souci à se faire . C'est moi qui doit modifier mon algo.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    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,

    Citation Envoyé par Flodelarab Voir le message
    C'est moi qui doit modifier mon algo.
    Cela me semble logique : une pile d'appel de plus de 7000 méthodes pour traiter un tableau de 750 éléments c'est énorme ! Qu'est-ce que ce serait avec un tableau encore plus grand ???


    Il faudrait utiliser un algorithme itératif

    a++

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Cela me semble logique : une pile d'appel de plus de 7000 méthodes pour traiter un tableau de 750 éléments
    Non, je l'ai écrit: 6335 éléments.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    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
    Citation Envoyé par Flodelarab Voir le message
    Non, je l'ai écrit: 6335 éléments.
    Ma calculette me donne pourtant le résultat suivant : 30x25 = 750

    a++

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Ma calculette me donne pourtant le résultat suivant : 30x25 = 750
    Raisonnement typique de lycéen (même si tu n'en ai plus un): L'important est de mettre sur ma copie ce que trouve la calculatrice ...
    Super, tu as re-découvert avec la calculatrice que 30x25=750 (t'avais bien besoin de toute la puissance d'une calculatrice). Et après ? L'énoncé dit que le nombre d'éléments n'est pas X fois Y mais 8 fois X fois Y plus 6 fois la somme de X et Y plus 5.

    Il vient avec ses questions, je viens avec mes réponses
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

Discussions similaires

  1. Quelle est la taille de la mémoire allouée à la JVM ?
    Par emie31 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/11/2006, 22h42
  2. Réponses: 5
    Dernier message: 08/11/2006, 12h41
  3. quelle est la taille maximale en nbre de caract d'un chp text
    Par harlock59 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 08/07/2006, 19h43
  4. Valide si... oui mais quelle est l'expression?
    Par SpyesX dans le forum Access
    Réponses: 1
    Dernier message: 28/10/2005, 16h38
  5. [SGBD] [PHP/MySQL Query]Quelle est la taille du tableau retourné?
    Par Jean_Benoit dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 07/10/2005, 20h10

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