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 :

StackOverflowError, récursivité trop profonde?


Sujet :

avec Java

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut StackOverflowError, récursivité trop profonde?
    Bonjour

    Le lance une fonction récursive pour parcourir un certain nombre de pixels. Ce parcours est fini, mais peut être long (j'ai vérifié, la fonction s'arrête bien sur des petits images).

    Pourtant j'ai cette erreur sur une image plus grande:
    Exception in thread "main" java.lang.StackOverflowError
    at java.awt.image.DirectColorModel.getRGB(Unknown Source)
    at java.awt.image.DirectColorModel.getRGB(Unknown Source)
    at java.awt.image.BufferedImage.getRGB(Unknown Source)
    J'ai regardé quelques autres réponses sur le sujet, mais qui mettaient l'accent sur le caractère infini de la boucle.

    Cette erreur peut-elle apparaître simplement si la récursivité va trop en profondeur?

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Cette erreur signifie que tu as consommé toute la mémoire allouée à Java. En général, cela signifie que ton programme récursif a un défaut caché. C'est à dire que tu utilises la mémoire de façon exponentielle sans t'en rendre compte.

    Tu peux augmenter la mémoire allouée à Java à l'execution, mais avant sois bien sûr que l'origine du problème n'est pas un défaut dans le code.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Java / JEE
    Inscrit en
    Février 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java / JEE

    Informations forums :
    Inscription : Février 2008
    Messages : 185
    Points : 293
    Points
    293
    Par défaut
    Bonjour,

    En effet c'est souvent le signe d'une récursion infinie.
    Si tu es sûr de ta méthode, tu peux augmenter la valeur de la mémoire allouée à la stack avec l'option -Xss.
    Par exemple : pour mettre 5 Mo. Sur une JVM HotSpot d'Oracle la valeur par défaut fait moins de 1Mo.

    Mathieu

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 75
    Points : 138
    Points
    138
    Par défaut
    Effectivement ta récursion peut-être la cause, mais c surtout le faite je pense que tu doit instancié des objets a chaque récursion. Je pense qu'il faudrait que tu évite d'instancie des objet a chaque récursion, plustot réutiliser les objets.

  5. #5
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Merci pour vos réponses.
    En fait j'ai changé un peu au hasard mon "synchronized void recursive()" par un simple "private void recursive()" et a priori ça fonctionne...

    Est-possible que ça vienne de là?
    Merci

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Java / JEE
    Inscrit en
    Février 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java / JEE

    Informations forums :
    Inscription : Février 2008
    Messages : 185
    Points : 293
    Points
    293
    Par défaut
    Citation Envoyé par Anduriel Voir le message
    Merci pour vos réponses.
    En fait j'ai changé un peu au hasard mon "synchronized void recursive()" par un simple "private void recursive()" et a priori ça fonctionne...

    Est-possible que ça vienne de là?
    Merci
    Ca parait un peu étonnant... A la fois "synchronized" pose un verrou, donc consomme de la mémoire... Suivant la profondeur ça pourrait jouer.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 75
    Points : 138
    Points
    138
    Par défaut
    Je pense que tu gagne un peu avec le syncronized en moins, mais si ta recursivité va plus loin a un moment tu retrouvera l'erreur.

  8. #8
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Bon, j'ai rien dit le problème est revenu

    Merci pour vos réponses, je vais reconsidérer ma fonction !

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Tu peux essayer de nous poster ta fonction ici.

  10. #10
    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 Catsoumoto Voir le message
    Effectivement ta récursion peut-être la cause, mais c surtout le faite je pense que tu doit instancié des objets a chaque récursion. Je pense qu'il faudrait que tu évite d'instancie des objet a chaque récursion, plustot réutiliser les objets.
    Ce n'est pas un problème de consommation mémoire sinon il aurait eu un OutOfMemory...


    Un StackOverflowError correspond bien à une pile d'appel de méthode trop grande, et généralement cela survient à cause de récursion trop importante...
    Comme l'a indiqué Influenza, tu as la possibilité d'augmenter la mémoire du stack avec -Xss, mais cela ne fait que reporter le problème.


    La meilleure solution serait de passer ta méthode recursive en iteratif...


    a++

Discussions similaires

  1. Fichiers Include imbriqués trop profondément
    Par doogy64 dans le forum C++
    Réponses: 1
    Dernier message: 06/09/2012, 16h44
  2. [PHP 5.3] trop de récursivité : fatal !
    Par e-deby dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2012, 19h21
  3. StackOverflowError et récursivité : ou comment dérécursifier.
    Par aeMAETH dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 13/03/2009, 21h31
  4. [MySQL] Récursivité trop longue
    Par johweb dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/10/2007, 15h52
  5. Debug un peu trop profond
    Par devroot dans le forum C++Builder
    Réponses: 4
    Dernier message: 03/06/2007, 20h12

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