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 :

[débutant] comment éviter les fuites de mémoire ?


Sujet :

Java

  1. #1
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut [débutant] comment éviter les fuites de mémoire ?
    Bonjour à tous,
    je voulais juste savoir quelles étaient les techniques à éviter pour ne pas avoir de fuite de mémoire (en particulier dans la gestion des threads) ?
    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Il n'y a pas de fuite puisqu'il y a le garbage collector. Mais une utilisation raisonnée de la memoire peut en effet augmenter les performances.

  3. #3
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Une fuite de mémoire, ça se produit en java quand tu gardes des références sur un objet temporaire qui n'est plus utilisé...

    En temps normal, il n'y en a pas... mais si tu veux t'en assurer, à la fin de ton traitement, tu forces toutes les variables que tu soupçonnes de pouvoir en provoquer à 'null'. Cela indiquera automatiquement au ramasse-miettes qu'il peut récupérer la mémoire correspondante.

    Sinon, JProbe est un bon outil pour détecter et résoudre les problèmes de fuite mémoire... mais il coute un peu cher
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  4. #4
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Je prend un exemple extrême :
    Une boucle while dans un thread ne crée pas de fuite mémoire? Le Gc ne peut jamais faire son travail...

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

    Citation Envoyé par dahtah
    Je prend un exemple extrême :
    Une boucle while dans un thread ne crée pas de fuite mémoire? Le Gc ne peut jamais faire son travail...
    Tu veux parler d'une boucle infini je pense ?

    Dans ce cas on ne peut pas parler de fuite de mémoire puisque les objets sont toujours utilisés par le thread en question...


    La plupart des fuites de mémoire sont dû soit à des objets stocké dans des collections static ou valide toute la durée de l'application sans jamais y être supprimé, soit à l'utilisation de resource non géré par le GC qui ne serait pas proprement libéré (les flux ou socket pas fermés par exemple).

    a++

  6. #6
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    d'accord.
    Je parlai bien d'une boucle infinie.
    Pour résumer, éviter de déclarer les variables en static (toujours utiliser des accesseurs et mutateurs donc?) et toujours libérer les flux et sockets.
    Ne pas monopoliser un objet.
    Pour le reste le Gc s'en charge.
    Si l'on est obligé d'utiliser une de ces méthodes, est-ce une bonne solution de forcer le passage du Gc?
    Merci à tous

  7. #7
    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 dahtah
    Pour résumer, éviter de déclarer les variables en static
    Pas forcément : mais un objet static sera présent pendant toutes la durée de l'application ! Il faut donc éviter d'y mettre l'image de 5 Mo du SplashScreen de démarrage

    Citation Envoyé par dahtah
    (toujours utiliser des accesseurs et mutateurs donc?) et toujours libérer les flux et sockets.
    Ne pas monopoliser un objet.
    Pour le reste le Gc s'en charge.
    Oui...
    Pour la libération des flux penser à utiliser des bloc finally...

    Citation Envoyé par dahtah
    Si l'on est obligé d'utiliser une de ces méthodes, est-ce une bonne solution de forcer le passage du Gc?
    Non non et non : dans ce sujet tu peux voir que l'appel explicite du GC provoque de grosses pertes de performances : Difference de performances Unix/Windows d'un programme?

    a++

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

Discussions similaires

  1. éviter les fuites de mémoire
    Par denispir dans le forum Débuter
    Réponses: 22
    Dernier message: 10/04/2012, 03h06
  2. comment détecter les fuites mémoires
    Par cyrille37 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 26/04/2008, 15h12
  3. Réponses: 3
    Dernier message: 05/07/2005, 18h07
  4. Comment éviter les doublons dans ma table
    Par einegel dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2004, 12h18
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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