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

Java Discussion :

Problème avec le tas


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut Problème avec le tas
    Bonjour,

    J'ai un petit soucis de mémoire... j'ai une application qui fait prend une base d'environ 500 titres de films et va chercher les informations sur allocine.

    Seulement au bout de 150-200 trouvailles, je me mange un joli "java.lang.OutOfMemoryError : Java heap space" .

    Qu'à cela ne tienne me suis-je dit, j'ai mis quelques traces à base de Runtime, ce qui m'a permis de me rendre compte que le problème vient "petit à petit", c'est à dire que c'est pas une seule recherche qui me bouffe mes 60Mo, mais je perds un peu de terrain au fur et à mesure.

    En plus c'est même pas régulier, c'est une augmentation en dent de scie, je perds 4Mo, j'en regagne 2, j'en reperds un peu, j'en gagne 2 fois... mais globalement je me fais grignoter mon tas .

    Ma question est donc simple : dans le but de trouver l'origine du drame, quelle est la procédure à suivre? Que me conseillez vous ? Parce que j'ai moyennement envie de mettre de la trace de partout sans trop savoir ou chercher...

    D'où peut venir ce problème ? Enfin, quelles sont les raisons les plus courantes ? Histoire que je sache vers où chercher...

    Typiquement l'algo est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for each titre
    {
      String = pageAllocine (titre) 
      Creation d'un objet "Film"
      parsage du String pour mettre les infos dans cet objet
      téléchargement de l'affiche du film
    }
    Merci d'avance !

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Honnêtement, dans ces cas-là, je me prends un profiler et je regarde ce qu'il a à me dire sur qu'est-ce qui bouffe le plus de mémoire et qu'est-ce qui le crée, pourquoi c'est pas garbage-collecté.

    Un truc qui m'est déjà arrivé, avec un pseudocode semblable au tien, c'est que "parsage de la page" produisait en fait des substring() de la page entière téléchargée, qui était assez massive car pleine de trucs inutiles. Or les substring() ne sont que des String pointant vers la String de départ, et indiquant où ça commence et où ça s'arrête. La String de départ (la page entière !) est donc gardée en mémoire aussi longtemps que les infos utiles le sont.

    Pour corriger, j'avais fait :
    - new String() sur chacun des substring() ainsi créées, pour les obliger à éliminer leur référence à la String de départ.

    - Plus tard j'ai pris un parseur thirdparties pour le format de données en question, m'évitant de parser moi-même. Et lui, les String qu'il extrayait n'étaient pas des substring().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 73
    Par défaut
    150-200 itérations, ça paraît assez peu, le memory leak doit être gigantesque
    Lorsque tu télécharges les affiches de film, tu les stockes sur le file system et n'en gardes que le chemin ? Tu libères bien toutes tes flux ? Une fois l'objet Film construit, la String contenant la page est Garbage collectable ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Un truc qui m'est déjà arrivé, avec un pseudocode semblable au tien, c'est que "parsage de la page" produisait en fait des substring() de la page entière téléchargée, qui était assez massive car pleine de trucs inutiles. Or les substring() ne sont que des String pointant vers la String de départ, et indiquant où ça commence et où ça s'arrête. La String de départ (la page entière !) est donc gardée en mémoire aussi longtemps que les infos utiles le sont.

    Pour corriger, j'avais fait :
    - new String() sur chacun des substring() ainsi créées, pour les obliger à éliminer leur référence à la String de départ.
    Je pressentais que mon problème venait de cette gestion des String... jvais tenter de placer quelques new String() de-ci de-là, ça va sans doute résoudre le problème.

    Qu'est ce que t'appelle un profiler ?

    Citation Envoyé par thelvin Voir le message
    - Plus tard j'ai pris un parseur thirdparties pour le format de données en question, m'évitant de parser moi-même. Et lui, les String qu'il extrayait n'étaient pas des substring().
    C'est quoi un parseur thirdparties ? Google est pas très bavard à ce sujet...

    Citation Envoyé par Mens Pervincet Voir le message
    150-200 itérations, ça paraît assez peu, le memory leak doit être gigantesque
    Lorsque tu télécharges les affiches de film, tu les stockes sur le file system et n'en gardes que le chemin ? Tu libères bien toutes tes flux ? Une fois l'objet Film construit, la String contenant la page est Garbage collectable ?
    150 - 200 itérations c'est pas énorme en effet mais je récupère un code html complet d'une page allociné à chaque tour, donc je peux comprendre que si je libère pas ça plantouille au bout d'un moment.
    Je pense pas que les affiches soient un problème car elles sont relativement petites ( environ 2Mo pour 150 affiches).
    Comme dit ci-dessus, le problème doit effectivement venir des String qui ne sont pas garbage-collectables. D'ailleurs, ya un moyen pour savoir si un objet est garbage-collectable ou faut juste faire gaffe à supprimer tout ce qui pointe dessus ?

    Thx

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Mopmop Voir le message
    Comme dit ci-dessus, le problème doit effectivement venir des String qui ne sont pas garbage-collectables. D'ailleurs, ya un moyen pour savoir si un objet est garbage-collectable ou faut juste faire gaffe à supprimer tout ce qui pointe dessus ?
    Un objet est "garbage-collectable" à partir du moment où il n'y a plus aucune référence vers lui...



    Donc il faut surtout regarder les données qui sont stocké dans ta boucle. Tu les stockes où toute ces informations ???


    a++

  6. #6
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Un objet est "garbage-collectable" à partir du moment où il n'y a plus aucune référence vers lui...



    Donc il faut surtout regarder les données qui sont stocké dans ta boucle. Tu les stockes où toute ces informations ???


    a++
    Voué je sais bien, mais ce que je voulais savoir c'est s'il y a un moyen de s'assurer qu'il est garbage-collectable (avec un IDE par exemple) ou s'il n'y a pas d'autre moyen que de faire bien gaffe à virer toutes les références.
    Les infos je les stocke dans mes objets "Film". Mais du coup effectivement, avec les substring qui gardent la String entière en mémoire, au lieu de stocker juste l'année de sortie du film je stocke la page HTML complète, c'est caca !

    Je vais donc modifier ça et je reviens crier victoire dans quelques minutes/heures

  7. #7
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut
    Victoire .

    Mais du coup une petite question se pose : mes objets String ont fait exploser mon tas, du coup je me dis que mes objets film peuvent le faire aussi non ?

    Genre 20th century fox tombe amoureux de mon magnifique logiciel et veut le faire tourner sur sa base de films... admettons.
    En plus, pas de chance, ils ont acheté tous les films du monde... admettons.
    Du coup ça tourne sur 30 millions de films et je créé donc 30 millions d'objets "film"... boom ou pas boom ? Les objets restent définitivement sur le tas ?

    A+

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 73
    Par défaut
    Ben dans ces cas là il te faut persister tes objets films en base de données au fur et à mesure, et les récupérer quand t'en as besoin.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2010
    Messages : 119
    Par défaut
    Moké... bon j'en suis pas encore là donc ça va ^^.

    Merci tout le monde, ça fonctionne bien... sauf que maintenant un autre problème survient ! Quand je ferme l'appli, j'enregistre tout dans un joli XML pour pouvoir récupérer ensuite. Quand je parse ce fichier si j'ai - de 500 films j'ai pas de problème, mais si j'en ai plus je retrouve mon copain le "java.lang.OutOfMemoryError : Java heap space"... Je vais donc devoir chercher par la, je reviendrais vous embêter si j'ai pas réussi.

    A+

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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