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éfinition de StackOverflowError


Sujet :

avec Java

  1. #1
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut Définition de StackOverflowError
    Bonjour tout le monde,
    J'aimerai savoir ce qu'est "exactement" un StackOverflowError ou en fait non, plutôt, c'est quoi la pile?
    Est-ce qu'il s'agit d'un objet relatif à java ou matériel?
    Si je sature la pile, est-ce que je suis face à une limite matériel ou une limite arbitraire imposer par java pour un question de sécurité ou de structure?

    Dans mon cas, j'ai une fonction qui s'appelle elle même jusqu’à l'erreur.
    Ce n'est pas une erreur de conception dans le sens ou l’erreur ne survient que dans la situation ou la qualité de l'entrer à traiter génère un trop grand nombre de boucles.
    Ma vrai question est, est t'il possible de redéfinir la taille de la pile pour faire accepter l’exécution de plus de boucles.

    Merci de votre aide.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Alors, c'est une limite de sécurité, qui est due à l'existence d'une limite matérielle. En effet la pile est curieusement, dans la mémoire, et la mémoire n'est pas infinie, dû au fait qu'elle est physiquement stockée dans des cartes mémoire, qui ne peuvent contenir que ce que leurs composants permettent.

    On pourra admettre que cette limite est du coup plutôt grande sur les machines actuelles, et qu'il est difficilement envisageable de l'atteindre quand il n'y a pas d'erreur d'empilement infini. C'est pas faux, mais à l'inverse, la pile est l'une de ces choses qu'on n'a pas besoin d'avoir de plus en plus grand avec l'évolution des capacités des ordis. Bon, un petit peu, mais en comparaison ça n'augmente pas vite, mais alors pas vite du tout. En conséquence, le fait de dépasser la capacité de la pile est presque toujours le résultat d'un empilement infini. Si on se contentait de réserver plus de mémoire pour la pile quand il y en a besoin, le seul effet que ça aurait, serait de dévorer toute la mémoire du système avant de finalement déclencher la même erreur qui si on ne l'avait pas fait. Sauf que cette erreur devrait être du coup gérée pendant que toute la mémoire a été réservée et que le système est en stress pour essayer de la libérer. On a rien gagné mais beaucoup perdu.

    Conclusion, il est généralement admis comme préférable d'ignorer l'existence du cas très rare où il n'y a pas d'empilement infini, mais la taille par défaut de la pile est insuffisante.

    Pour les programmes qui en ont quand même besoin, il est possible de démarrer en réclamant une pile plus grande que par défaut, et Java permet cela aussi. Je ne pense pas pouvoir trouver de ressource en français, mais une simple rechercher Google en anglais devrait largement suffire.

    Pour info, le concept de pile est fondamental pour l'informatique, et présent directement dans les microprocesseurs, qui ont des instructions de push, pop, et même de quoi "push tout l'état actuel" et "pop un état entier" qui sert à appeler des fonctions et à en revenir. Toutefois, Java gère la pile de manière un peu hybride, du fait de son propre système d'exécution qui est hybride entre l'émulation de la machine virtuelle, et l'exécution native après une conversion just-in-time du bytecode. Forcément le natif utilise la pile du processeur, alors que l'émulation utilise une pile sauce Java, qui a le même principe mais ses propres détails. Typiquement, définir la taille de la pile signifie que chacune de ces piles réserve cette taille. Et que chaque thread a ses deux piles.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué Avatar de Pecose
    Homme Profil pro
    Batiment
    Inscrit en
    Février 2013
    Messages
    310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Batiment
    Secteur : Bâtiment

    Informations forums :
    Inscription : Février 2013
    Messages : 310
    Points : 194
    Points
    194
    Par défaut
    Ok, merci. J'ai rajouté un et ça fonctionne.
    Des jours c'est facile, des jours c'est pas facile, mais c'est jamais le même jour.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Regarde l'article sur wikipedia au sujet la pile

    En gros, le système d'exploitation va donner au programme de la mémoire. Cette mémoire va être coupée en 2 :
    • la pile, qui commence à la toute fin et va grossir dans le sens descendant
    • le tas, qui commence à 0 et va grossir dans le sens ascendant

    Ensuite, c'est 1 peu + compliqué avec les données statiques, les données "read only", ...

    Le tas permet d'allouer dynamiquement de la mémoire.
    La pile permet d'enregistrer les variables locales et tous les paramètres des fonctions/ procédures des appels (mais cela dépend de la convention d'appel, lien wikipedia)

    Et donc tu as l'erreur "stack overflow" lorsque la capacité de la pile est dépassée, tu as fait trop d'appels.

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 09/08/2007, 11h46
  2. Réponses: 2
    Dernier message: 29/07/2003, 12h52
  3. [Sybase] Définition des symboles
    Par SoaB dans le forum Sybase
    Réponses: 5
    Dernier message: 19/03/2003, 23h06
  4. Définition de "Métalangage"
    Par No dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 19/07/2002, 14h05

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