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

Langage Java Discussion :

[debutant]Optimisation de code


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut [debutant]Optimisation de code
    Bonjour,

    je suis en train de développer une petite IHM en java. J'ai instancié beaucoup (trop ?) d'objets et du coup j'ai eu l'erreur suivante :

    java.lang.OutOfMemoryError: Java heap space
    J'ai donc rajouté l'argument -Xmx512M dans les arguments sous eclipse car 256M ne suffisait pas...

    Mon appli ne devrait pas consommer autant de ressources pour ce qu'elle produit comme résultat

    J'aimerais donc connaître votre avis sur des éventuels optimisation de code. Je joins ma classe au post car je n'ai pas assez de place pour mettre tout mon code.

    Merci par avance.

    PS : soyez indulgent avec moi je débute

    Pièce jointe 25858

  2. #2
    Membre très actif
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Par défaut
    Dans ton cas, je pense qu'il ne s'agit pas d'optimiser mais de verifier le code que tu as écris pour voir s'il n'y a pas une coquille : une IHM ne recquiert en general pas beacoup d'espace en memoire. Ton appli integre elle un algorithme ? Il y a de fortes chances que la memoire occupée le soit par la partie métier et non par la partie presentation de ton appli.
    ps: j'avais pas vu que t'avais joint les sources, j'y jette un oeil

  3. #3
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Merci pour ta réponse.

    En fait, j'ai recommencé à coder mon appli car je voulais stocker tous mes objets dans un tableau (Vector). Avant, aucun souci de mémoire maintenant si et je pense que je m'y prend mal pour stocker mes objets dans mon vecteur.

  4. #4
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    - d'une part il faut que tu dissocies la partie graphique de la partie données. Tu n'affiches pas tous les composants Swing en même temps ? Dans ce cas tu peux créer une classe AllyView qui prend une référence sur une instance d'Ally, récupère les valeurs et modifie tous les composants graphiques, mais les composants n'existent qu'en un seul exemplaire (là je crois que t'en crées au moins 50000 c'est normal que ça rame).

    - d'autre part, pourquoi chaque objet Ally contient autant d'autres objets ? Ca donne un côté récursif au modèle qui me semble inadapté. Tu as vu que l'objet objectConstructionT81 par exemple va contenir lui-même 12 planètes, 40 constructions, etc, il me semble que c'est pas le but recherché

    Plus d'infos sur le but exacte de la classe aurait été apprécié ^^
    A+

  5. #5
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Salut,
    Tu as vu que l'objet objectConstructionT81 par exemple va contenir lui-même 12 planètes, 40 constructions, etc, il me semble que c'est pas le but recherché

    peux-tu m'expliquer comment tu es arrivé à cette conclusion stp car c'est vrai que je n'ai pas l'impression de maîtriser la portée de tous mes objets...

    Merci

  6. #6
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Bin même si t'appelles pas instanciationObjets() à chaque fois (ah si dans le constructeur), tu déclares dans ta classe Ally une centaine d'autres Ally qui chacun déclare une centaine d'autres Ally.

  7. #7
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objetPlaneteL1 = new Ally(planeteL1, 35, 54, 100, 10);
    Appelle bien juste le constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Ally(JLabel jlabel, int coorX, int coorY, int width, int height)
    et pas toute la classe, non ?

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Y'a pas à chercher plus loin :

    Un objet ally, à sa construction, en crée 300 autres. Or, ces 300, à leur construction, ils en créent au total 300 * 300 = 90.000, et ces 90.000, à leur construction en créent 90.000x300 = 27.000.000 et paf 27 millions x4 bytes = 100 Mo en mémoire. Et là, on n'a pas encore fait 27E6x300 ni la suite

    Edit : tu appelles le constructeur, donc une nouvelle instance de la classe. Et chaque nouvelle instance de la classe en appelle une autre. Alors bon... tu arrives vite à saturer ta mémoire

    Autre edit : Utilise les collections, elles sont là pour t'aider, tu verras

  9. #9
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    D'ailleurs je me demande comment ça pouvait fonctionner même avec 512M car c'est récursif.

    Quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objetPlaneteL1 = new Ally(planeteL1, 35, 54, 100, 10);
    Tous les membres sotn déclarés (donc tous les Ally), et tous les composants Swing sont déclarés et instanciés car tu fais un new directement dans la déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JLabel planeteL1 = new JLabel("PM");
    Si tu nous dis ce que tu veux faire, on peut peut-être te proposer un modèle de classes plus adapté .

  10. #10
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    ohoh merci pour l'explication qui pourrait expliquer beaucoup de choses

    Comment faire alors pour éviter d'instancier tous ces objets ?

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Par défaut
    Tu découpes logiquement ton application en :

    classe Application,
    classe Planete,
    classe Technologie,
    classe Flotte,
    ...

Discussions similaires

  1. Optimisation de code T-SQL (DEBUTANT)
    Par sono_strass dans le forum Développement
    Réponses: 2
    Dernier message: 30/06/2011, 13h37
  2. optimisation de code (tres simple le code mais je debute)
    Par karlakir dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/04/2009, 16h43
  3. [debutant] optimisation du code
    Par Ganondorf dans le forum Langage
    Réponses: 4
    Dernier message: 23/09/2007, 06h25
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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