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 :

Gestion de Mémoire Java


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Gestion de Mémoire Java
    Salut,


    Je suis exposé en ce moment à des pbs de gestion de la mémoire pour mon programme. J'ai des pbs de outofmemoryerror.
    J'explique ma situation :
    J'ai une application de gestion en swing qui se découpe en plusieurs jinternalframe dont une qui s'occupe de la gestion d'un calendrier hebdomadaire d'activités, composé de JPanel. J'ai ajouté sur ce calendrier des bouton pour avancer et reculer dans la semaine et a chaque avancement de semaine, je fais des revalidate et des repaints de mes jpanel lors d'un ajout d'activités(mes activités sont contenues dans une bd mysql).
    Au bout d'un moment , le programme plante, parce que je n'ai plus assez de mém
    oire disponible.
    J'ai 2 hypothèses : Est ce que le plantage vient du fait de réactualiser les requetes souvent ?
    En outre, j'utilises un statement à et un resultset à chacune de mes requetes mais je ne les detruis pas.
    Je constate aussi que l'allocation mémoire pour mon programme augmente de plus en plus dans la barre des taches windows. Est ce normal ? Est ce qu'on peut le faire baisser ?
    Est ce que je peux faire quelquechose contre ca ? Ca m'embete un petit peu parce que je n'ai pas de solutions.

  2. #2
    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,


    Difficile de t'aider comme cela, mais oui ton programme consomme trop de mémoire.

    Si tu penses que c'est normal et que tu as de gros besoin en mémoire tu peux augmenter la mémoire utilisable avec les options -Xmx et -Xms de java.

    Sinon il te faudra déterminer l'origine de cette "fuite" de mémoire...


    Citation Envoyé par lebulls
    En outre, j'utilises un statement à et un resultset à chacune de mes requetes mais je ne les detruis pas.
    Tu ne les détruis pas et tu ne les fermes pas ??? En as-tu encore besoin ? Ton problème pourrait venir de là...

    Citation Envoyé par lebulls
    Je constate aussi que l'allocation mémoire pour mon programme augmente de plus en plus dans la barre des taches windows. Est ce normal ? Est ce qu'on peut le faire baisser ?
    Il faut que tu libères les références des objets que tu n'utilises plus, et que tu libères proprement les ressources...

    a++

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Comment je fais pour libérer proprement mes statements et mes resultsets ? Comment fait tu pour libérer les ressources ? je donne un exemple de mes requetes.Creneau est un type que j'ai créé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public Creneau getCreneau (String dateCreneau,String groupe)
     
    Creneau c=null;
    tabdate=null;
    tabdate=datecreneau.split("/");
    String req="Select * from machin where date=dateCreneau and groupe =groupe"
    try{
    Statement inst;
    inst=conn.createStatement();
    Resultset resultat =instruction.executeQuery(req);
    while(resultat.next())
    {
    c=new Creneau(.....)
    }
    }
    catch(Exception e)
    {
    System.out.println(e);
    }
     
    return c; (c'est mon creneau)
    }
    Que puis je faire pour améliorer ce type de requete ?

    Je te donne un chiffre. En gros pour ma mise a jour de mon planning, je fais 63 requetes et la mémoire utilisée dans la barre des taches augmente d'environ 300ko a chaque fois. Comment faire pour que ca pèse moins lourd ?

    J'ai vu que beaucoup de personnes disaient qu'il fallait mettre les objets à null apres les avoir utilisés mais beaucoup affirmaient aussi le contraire. Est ce que tu as des astuces la dessus ?

    Y'a t'il des logiciels qui permettent de détecter une fuite mémoire sous eclipse ?

  4. #4
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Il faut ajouter un bloc finally à tes try/catch et fermer les resultSet et Statement via la méthode close();

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Merci mon petit gimli.. Ca a complètement résolu mon pb.Tu me sors vraiment d'un sale pétrain ...J'active le petit résolu

  6. #6
    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
    Citation Envoyé par lebulls
    J'ai vu que beaucoup de personnes disaient qu'il fallait mettre les objets à null apres les avoir utilisés mais beaucoup affirmaient aussi le contraire. Est ce que tu as des astuces la dessus ?
    La mémoire est géré par le Garbage Collector, donc il suffit bien de mettre les références à null pour que la mémoire soit libérée. Toutefois rien ne garantit que la mémoire sera libéré immédiatement.

    Par contre elle sera bien libéré avant qu'une OutOfMemoryException ne soit générée...



    Par contre pour des ressources plus complexes (fichiers, sockets, etc.), il est neccessaire de fermer proprement la ressource avant afin de la libérer au niveau du système d'exploitation. Donc tu dois fermer tes ResultSet/Statement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
            try {
                Statement inst = conn.createStatement();
                try {
                    ResultSet resultat = inst.executeQuery(req);
                    try {
                        while (resultat.next()) {
                            // c=new Creneau(.....)
                        }
                    } finally {
                        resultat.close();
                    }
                } finally {
                    inst.close();
                }
            } catch (Exception e) {
                System.out.println(e);
            }
    Plus de détail : http://www.developpez.net/forums/sho...04#post1170704
    (si le lien est mort c'est que c'est intégré à la FAQ)

    a++

    [edit] outch ! j'suis vraiment trop lent

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

Discussions similaires

  1. gestion mémoire Java
    Par donnadieujulien dans le forum Général Java
    Réponses: 10
    Dernier message: 15/09/2008, 15h59
  2. Gestion de mémoire dans Java ?
    Par nolofinwe dans le forum Langage
    Réponses: 13
    Dernier message: 10/01/2008, 13h37
  3. Réponses: 5
    Dernier message: 27/03/2007, 09h51
  4. probleme de mémoire : Java heap space
    Par Seb33300 dans le forum Interfaces Graphiques en Java
    Réponses: 10
    Dernier message: 21/02/2007, 13h40
  5. [applet] gestion des versions Java
    Par bigVinz dans le forum Applets
    Réponses: 1
    Dernier message: 09/12/2005, 15h06

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