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 :

Conseil optimiser la mémoire


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Par défaut Conseil optimiser la mémoire
    Bonjour,

    J'ai développé une application devant tourner en tache de fond sur un pc sans interruption. Pour cela, il me faut gérer correctement la mémoire de celle ci.

    Voici grosso modo, ce que contient mon application:
    -Une interface graphique dynamique avec 2 JfreeChart et un jtable.
    -Plusieurs thread ayant chacun une connexion JMS.
    -7 Timers pouvant tourner simultanémenet.

    Je pense avoir cité les objets utilisant le plus de ressource.

    J'ai remarqué que depuis que j'ai mi en place les timers, mon application est devenu beaucoup plus gourmande en mémoire. J'utiliise Jconsole pour mes tests de mémoire.

    Avez vous quelques conseils à me donner pour la gestion de la mémoire?

    PS: j'ai déja parcouru les tuto sur ce sujet.

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    y'a pas de miracles, pour gérer correctement la mémoire:

    1) fermer manuellement dans un finally toutes les ressources systèmes (flux, connexions, ...)
    2) dès qu'un objet n'est plus utile, on met sa référence à null (principalement les champs de classe, les variables locales étant automatiquement détruites)
    3) on profile avec un profiler (de préférence plus évolué que jconsole) et on interprète les résultats: on regarde les allocations, on exécute le garbage collector, et on voit quelles sont les objets qui n'ont pas pu être collectés

    c'est pas très facile, mais y'a rien d'autre en magasin

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Par défaut
    Est ce que Java VisualVM est plus évolué que JConsole?

  4. #4
    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 Pill_S Voir le message
    2) dès qu'un objet n'est plus utile, on met sa référence à null (principalement les champs de classe, les variables locales étant automatiquement détruites)
    Mais si on a besoin de mettre à null un attribut de classe c'est qu'il y a un soucis : cela ne devrait pas être un attribut mais une variable locale...

    Une erreur fréquente étant de tout mettre en attribut (voir en static) par "simplicité".

    a++

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par tupac25 Voir le message
    Est ce que Java VisualVM est plus évolué que JConsole?
    Oui en effet.
    Entre autres, avec Visual VM on peut observer la mémoire et les processus en détail au runtime.

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Mais si on a besoin de mettre à null un attribut de classe c'est qu'il y a un soucis : cela ne devrait pas être un attribut mais une variable locale...
    +1, mais par principe je rappelle la règle: il y a certains cas où cela peut s'envisager (p.ex. mise en cache d'un résultat quelconque jusqu'à ce qu'on l'invalide en le mettant à null, ou suppression d'un objet d'un ThreadLocal lorsqu'on sait que le thread va mourir, etc)


  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Par défaut
    Est ce que cette déclaration est mauvaise alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Class MaClass{
     
      private Object obj = null;
     
      public void method(){
     
         obj = new Object();
      }
    }
    Sachant que je n'ai pas besoin que mon objet soit global.

  8. #8
    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
    @tupac25 question : a quoi sert 'obj' ???

    Sans la réponse à cette question, impossible de t'en dire plus...

    a++

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Par défaut
    Disons que obj est une classe à laquelle je fais un unique appel et dont je n'ai plus besoin par la suite.

  10. #10
    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
    Dans ce cas pose-toi cette question : quel intérêt y-a-t-il à conserver cet objet en attribut d'instance, alors que tu ne t'en sers que localement.

    Bref cela devrait être un paramètre locale de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Class MaClass{
      public void method(){
         Object obj = new Object();
      }
    }
    Ce qui facilite le travail de tout le monde et c'est tout bénef :
    • Le développeur sait qu'il s'agit d'une variable locale uniquement. Pas besoin de pourrir les attributs de la classe avec 150 attributs inutile.
    • Le GC sait qu'il s'agit d'un objet temporaire, qu'il pourra nettoyer rapidement.
    • La JVM sait qu'il s'agit d'une variable locale, qui ne sera jamais null ni jamais modifié par un autre thread, et peut donc optimiser ses accès en conséquence.


    a++

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Par défaut
    Merci! Je vais devoir faire un grand nettoyage de mon code alors. J'ai pris l'habitude de déclarer toutes mes classes en attribut de classe... je trouvais cela plus lisible...

    Et c'est la premiere fois que je dois faire attention à la gestion de la mémoire donc je pense qu'il y a pas mal de point qu'il va falloir que je revoie.

    Sinon est ce que les Timer sont gourmant en mémoire? j'ai remarqué une grosse augmentation en ressource depuis que je les ai ajouté à mon code.

  12. #12
    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
    Un timer en lui même ne représente pas grand chose...

    C'est son traitement qu'il faut voir. S'ils manipulent des données lourdes et comment...


    a++

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    294
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 294
    Par défaut
    C'est un Timer avec une période hebdomadaire soit 604 800 000 milliseconde mais le traitement réalisé est très lègé. Le problème doit venir d'autre chose alors.

    EDIT:
    Après plusieurs heures de test voici ce qui en ressort:
    Le nombre de classe n'évolue pas, il reste stabel.
    Le nombre de thread régulier.
    L'usage du CPU ne depasse pas 3%
    Heap size et used heap sont regulier aussi mais je remarque de forte augmentation des que je modifie la taille de ma fenetre.

    Je pense que les 3 premiers points sont positifs mais pour le Heap size je dois avoir un petit probleme. Lorsque j'ai de net augmentation, elle ne diminue pas ensuite et garde la valeur max qu'elle a eu. Après plusieurs modification de la taille de ma fenêtre, l'application devient trop gourmande.

    Est ce que cela est du à un mauvais développement de ma GUI?

Discussions similaires

  1. optimiser java mémoire, charge
    Par cdm1024 dans le forum Général Java
    Réponses: 3
    Dernier message: 24/02/2009, 17h17
  2. Optimiser la mémoire pour réduire le temp d'import
    Par Bourak dans le forum Administration
    Réponses: 20
    Dernier message: 03/11/2008, 10h23
  3. Optimiser la mémoire d'une app VB 2005
    Par Diabless6 dans le forum VB.NET
    Réponses: 34
    Dernier message: 21/08/2007, 19h18
  4. Optimisation de mémoire / rapiditée
    Par Zenol dans le forum C++
    Réponses: 9
    Dernier message: 25/09/2005, 11h18

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