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 :

Optimisation d'une application Java


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant - Développeur Web/Logiciel
    Inscrit en
    Mai 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant - Développeur Web/Logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 67
    Par défaut Optimisation d'une application Java
    Bonjour,

    Je développe actuellement une application en Java récupérant le contenu précis d'une page HTML.
    Cela se fait en plusieurs étapes :
    • Je récupère un id dans une page
    • Je charge une deuxième page avec cette id
    • Je récupère mon contenu voulu, dans cette deuxième page
    • Je retourne dans mon programme principal
    • J'écris les informations que j'ai collecté dans la page HTML, dans un fichier txt
    • Et je repars pour un autre id


    Il se trouve que j'ai besoin de faire, environ, 83 000 fois cet "algo".
    Et, peut-être que vous vous en doutez, j'ai eu le droit à un gc overhead limit

    Je cherche donc à simplifier mon code notamment au niveau de la déclaration de mes variables.

    A ce propos, qu'elle est la méthode la plus "éco" entre ces deux propositions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String maString = "http://monsite.com/...";
    /* Traitement avec la string */
     
         for(...){
               maString = "http://monsite.com/...";
               /* Traitement avec la nouvelle string */
         }
    &

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    String maString = "http://monsite.com/...";
    /* Traitement avec la string */
    maString = null;
         for(...){
               new maStringBis = "http://monsite.com/...";
               /* Traitement avec la nouvelle string */
         }
    Y'a-t-il d'autres pistes pour éviter le gc overhead limit sachant que je n'opterais pas pour l'augmentation de la mémoire allouée car j'obtiens le gc overhead limit bien avant avoir fait la moitié du traitement (et même le quart) donc ça ne servirai à rien.

    Merci d'avance pour vos réponses.

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Tu as l'air de vouloir optimiser des strings contenant des URL. A vue de boule de crystal, je dirais qu'il n'y a aucune chance que le probleme vienne de la.
    Montre plutot le code qui recupere la page et la traite, c'est beaucoup plus probablement la qu'est le probleme (ma boule de crystal me dit que tu gardes quelques references dans un coin qui empechent la memoire des pages que tu as lues d'etre libérée).

  3. #3
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new maStringBis = "http://monsite.com/...";
    Ca compile ça?


    Sinon, mon canard en plastique vient de me donner des infos intéressantes :
    - on n'optimise pas les String autrement qu'en évitant d'en créer (c'est paradoxal mais c'est lié à la nature même des String)
    - on soupçonne ton code d'être récursif... Donc dans tous les cas y'a danger.
    - tu fais un aspirateur de site
    - tu ne sais pas comment fonctionne la collecte des objets avec le garbage collector (d'un autre côté, si tu es en Java 5 ou moins, on ne pourra pas faire grand chose pour toi)

    Petite astuce du coup : créé tes variables qui doivent être réutilisées dans une méthode à part !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ...
        String basePage = "http://url de base commune à toutes les pages"
        for (...){
            traitementPage(id);
        }
    ...
     
    private void traitementPage(Long id){
        StringBuilder sb = new StringBuilder();
        sb.append(basePage);
        sb.append(id);
        //traitement
    }
    Toutes les variables déclarées dans la méthode traitementPage seront marquées comme "bonnes à être purgées" à chaque fois que tu sortiras de la méthode. Mets-y les éléments qui sont consommateurs de ressources.
    N'hésites pas à te renseigner sur le fonctionnement du garbage collector, des références pour comprendre comment bien "optimiser" du code. La clé est la suivante : garder le moins de références possibles et ne pas déclarer de nouvelles variables dans les boucles !


    Et sinon, lors de l'exécution, pour voir ce qui consomme, lance jVisualVm (directement en ligne de commande ou dans le dossier d'installation de ton JDK)

    Bonne chance et hésite pas à poser des questions (et à nous donner plus d'éléments pour qu'on puisse te répondre)


    Petit rappel pour Java 8 : http://docs.oracle.com/javase/8/docs...r_excessive_gc
    The parallel collector throws an OutOfMemoryError if too much time is being spent in garbage collection (GC): If more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, then an OutOfMemoryError is thrown. This feature is designed to prevent applications from running for an extended period of time while making little or no progress because the heap is too small. If necessary, this feature can be disabled by adding the option -XX:-UseGCOverheadLimit to the command line.
    En gros, ton erreur arrive parce que ton programme passe plus de 98% du temps à essayer de faire de la place en mémoire pour arriver à tourner !

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant - Développeur Web/Logiciel
    Inscrit en
    Mai 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant - Développeur Web/Logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 67
    Par défaut
    Ouh ça chambre dur dur par ici

    Merci à vous deux pour vos réponses !
    Je pense avoir trouvé le problème. En gros, j'utilise HTMLUtil pour récupérer le contenu HTML.
    Seulement, aux alentours de 2h-3h du mat, d'une on ne voit pas les messages d'avertissements d'Eclipse (j'vous jure ) et de deux on pense pas à .close() le client web
    J'ai relancé une exécution ce matin, on verra le résultat en rentrant ce soir! Je vous tiendrais au courant de toute façon !

    Citation Envoyé par hwoarang Voir le message
    Tu as l'air de vouloir optimiser des strings contenant des URL. A vue de boule de crystal, je dirais qu'il n'y a aucune chance que le probleme vienne de la.
    Montre plutot le code qui recupere la page et la traite, c'est beaucoup plus probablement la qu'est le probleme (ma boule de crystal me dit que tu gardes quelques references dans un coin qui empechent la memoire des pages que tu as lues d'etre libérée).
    En effet, ta bubulle avait vu juste !

    Citation Envoyé par eulbobo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new maStringBis = "http://monsite.com/...";
    Ca compile ça?
    Non, c'était un espèce de truc à mi-chemin entre le Java et du... hum... pseudo-code, allez !

    Citation Envoyé par eulbobo Voir le message
    - on n'optimise pas les String autrement qu'en évitant d'en créer (c'est paradoxal mais c'est lié à la nature même des String)
    - on soupçonne ton code d'être récursif... Donc dans tous les cas y'a danger.
    - tu fais un aspirateur de site
    - tu ne sais pas comment fonctionne la collecte des objets avec le garbage collector (d'un autre côté, si tu es en Java 5 ou moins, on ne pourra pas faire grand chose pour toi)
    Pour le coup des String, en effet, j'en avais entendu parler. Mon code par contre n'est pas récursif donc aucun problème là-dessus (j'itère simplement avec une boucle for).
    Malheureusement ton canard n'a pas vu juste pour le coup de l'aspirateur, je cherche simplement à récupérer une ou deux infos dans une page HTML afin de les exploiter, rien de plus
    Le truc aussi c'est que ces deux petites infos, elles sont valables pour plusieurs éléments du site, d'où le nombre assez important d'itération ! Bref, ce n'est pas la question.
    Même pas ! Je suis en Java 8 !

    Citation Envoyé par eulbobo Voir le message
    Petite astuce du coup : créé tes variables qui doivent être réutilisées dans une méthode à part !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ...
        String basePage = "http://url de base commune à toutes les pages"
        for (...){
            traitementPage(id);
        }
    ...
     
    private void traitementPage(Long id){
        StringBuilder sb = new StringBuilder();
        sb.append(basePage);
        sb.append(id);
        //traitement
    }
    Toutes les variables déclarées dans la méthode traitementPage seront marquées comme "bonnes à être purgées" à chaque fois que tu sortiras de la méthode. Mets-y les éléments qui sont consommateurs de ressources.
    N'hésites pas à te renseigner sur le fonctionnement du garbage collector, des références pour comprendre comment bien "optimiser" du code. La clé est la suivante : garder le moins de références possibles et ne pas déclarer de nouvelles variables dans les boucles !
    Je vais étudier ça de plus près ! Merci !


    Citation Envoyé par eulbobo Voir le message
    Et sinon, lors de l'exécution, pour voir ce qui consomme, lance jVisualVm (directement en ligne de commande ou dans le dossier d'installation de ton JDK)
    Ah oui, ça m'intéresse pour le coup cette petite chose ! Je suppose que c'est contenu de base dans Eclipse.


    Citation Envoyé par eulbobo Voir le message
    Petit rappel pour Java 8 : http://docs.oracle.com/javase/8/docs...r_excessive_gc

    En gros, ton erreur arrive parce que ton programme passe plus de 98% du temps à essayer de faire de la place en mémoire pour arriver à tourner !
    Oui j'avais vu ça en cherchant sur Google. Mais c'est la première fois que je suis confronter à cette situation. Il faut un début à tout

    Encore merci à vous deux !
    A ce soir !

  5. #5
    Membre Expert
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Par défaut
    Citation Envoyé par JustyDark Voir le message
    Ah oui, ça m'intéresse pour le coup cette petite chose ! Je suppose que c'est contenu de base dans Eclipse.
    Non, c'est contenu de base dans le JDK ^^


    Oui ça chambre, mais tu avoueras que tu as pas laissé beaucoup d'éléments pour qu'on t'aide à la base :p
    Bonne chance !

    Et si tu as plus de questions, hésites pas !

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant - Développeur Web/Logiciel
    Inscrit en
    Mai 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant - Développeur Web/Logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 67
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Oui ça chambre, mais tu avoueras que tu as pas laissé beaucoup d'éléments pour qu'on t'aide à la base :p
    J'avais tout prévu

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/05/2007, 18h10
  2. Utiliser ssh dans une application java
    Par Samanta dans le forum Sécurité
    Réponses: 12
    Dernier message: 28/02/2007, 16h30
  3. Sécuriser une application java (stand alone)
    Par debutant java dans le forum Sécurité
    Réponses: 4
    Dernier message: 05/04/2005, 13h28
  4. [Son] Faire des bruits avec une application java
    Par mammistegon dans le forum Multimédia
    Réponses: 6
    Dernier message: 22/01/2005, 17h17

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