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 dans Java ?


Sujet :

Langage Java

  1. #1
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut Gestion de mémoire dans Java ?
    Bonjour,

    Quelqu'un pourrai t'il m'expliquer comment on peut gerer la mémoire dans java en évitant les fuites (de mémoire) ? J'essai désespérement de faire des recherches dans la FAQ mais je pense que je n'utilise pas les bon mots clés du coup je tourne en rond

    Merci d'avance.
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Java gère tout seul la liberation de la memoire. C'est a dire que lorsqu'un objet n'est plus referencé, il est automatique désalloué.

    Les fuites mémoires existent si tu gardes indéfiniment une reference sur un objet

    Les mots clé sont garbagge collector (ou ramasse miettes).

  3. #3
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    je viens de regarder ce qu'en dit la FAQ et voici ce que j'ai trouvé:

    Il existe néanmoins la fonction gc de la classe java.lang.System qui permet de faire un appel explicite au garbage collector. Cet appel ne garantit pas que tous les objets inutiles seront supprimés de la mémoire.
    J'ai compris que certain code peuvent bloquer gc dans son execution (enfin c'est ce que j'ai compris de l'explication de mon tuteur de stage XD)... Quelqu'un aurai t'il une doc expliquant comment gc fonctionne afin que je puisse adapter mes programmes pour faciliter son execution ?
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  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 : 35
    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
    Citation Envoyé par nayah Voir le message
    J'ai compris que certain code peuvent bloquer gc dans son execution... Quelqu'un aurai t'il une doc expliquant comment gc fonctionne afin que je puisse adapter mes programmes pour faciliter son execution ?
    Il ne faut pas utiliser la méthode System.gc(). Le Garbage Collector se débrouille très bien tout seul. Ce à quoi il faut faire attention est de ne pas ouvrir des fichiers trop gros entièrement dans la mémoire ou alors d'instancier des objets dans des boucles longues.

    C'est assez rare d'avoir des problèmes de mémoire sur un programme Java. C'est quoi ton problème exactement ? Tu utilises trop de mémoire ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Les problemes de garbage collector sont assez subtiles, et si la libération de mémoire en java est quelque chose de nouveau pour toi, il est sans aucun doute trop tot pour chercher à optimiser quoique ce soit. La stratégie de libération mémoire du systeme repond à la tres grande majorité des besoins.


    Tu peux lire cet article. C'est tres interessant.

  6. #6
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    En réalité je suis en ce moment en autoformation dans ma boite et on m'a demander de me pencher en particulier sur la gestion de mémoire... Les programmes que je vais avoir a développer dans les mois a venir sont des programmes destinés a fonctionner jours et nuits et d'aprés ce que mon tuteur m'a expliqué il fait que je métrise tout ca parce que la moindre fuite peut avoir pas mal de conséquences...

    En bref je n'ai pas de probleme particulier mais je cherche un maximum de documentation pour comprendre comment gc fonctionne (meme si je l'appelle pas c'est juste pour qu'il soit optimisé au maximum).

    merci pour le lien sanguko il a l'air assez complet je m'y met de suite

    merci encore
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 166
    Points
    4 166
    Par défaut
    C'est assez rare d'avoir des problèmes de mémoire sur un programme Java
    Ca, c'est la théorie.
    En pratique, il arrive de trouver des projets en entreprise avec des fuites mémoires.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Tu peux confronter à 2 types de problèmes :
    - les pics mémoires
    - l'augmentation de la mémoire consommée

    Les pics mémoires peuvent se produire lorsqu'une opération crée beaucoup d'objets, des objets gourmands en mémoire (comme des images ou des gros fichiers), etc...

    La consommation mémoire peut augmenter avec le temps si tu gardes des références vers des objets. Typiquement, il faut être conscient que les attributs static, s'ils ne sont pas mis à null, ne vont pas être libérés. Si tu as des listes static, il faut faire attention à limiter le nombre d'éléments, voir à les vider de temps en temps.

  9. #9
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    C'est pour ca que j'essai de me renseigner au maximum.

    ok je commence a comprendre a peu prés comment ca fonctionne... c'est pas gagner mais j'espere etre au point sur le sujet ce soir

    merci beaucoup pour ton aide sanguko
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

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


    La règle la plus importante pour le GC : il faut limiter au maximum la porté des objets, ce qui diminuera leurs durées de vie.
    Inutile de conserver des objets qui ne serviront plus...


    Pour cela quelques conseils :

    • Utiliser correctement les attributs static, c'est à dire seulement pour des valeurs constantes, car il faut garder en mémoire que les objets static seront "vivant" pendant toute l'application.
      Il ne faut surtout pas utiliser le static pour "faciliter" le passage d'objet entre classe, ou pire pour stocker des objets (du style une List static).

    • Il faut également bien faire la distinction entre attributs d'instance et variable locale. Bien souvent on utilise des attributs d'instances à la place de variables locales pour simplifier le code (une seule déclaration). Or les attributs d'instances ont une durée de vie bien plus longue et il est inutile de les conserver pour rien si c'est pour les écraser par la suite...

    • Il faut toujours libérer les ressources qui ne sont pas géré par le garbage collector (flux d'entrée/sortie, connexion JDBC, etc...).



    a++

  11. #11
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    merci beaucoup pour tous vos conseil. Je commence a comprendre comment ca fonctionne meme si c'est plus compliqué que ce que je pensais...
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Bonjour et meilleurs voeux à tous !

    Quelles seraient les précaution/préconisation à prendre pour les attributs d'instance et variable locale ?

    Dans le cas d'une application qui tourne indéfiniement, si par exemple on déclare une variable dans une boucle "while" et non en dehors, cela peut-il prendre de la mémoire sur le long terme ?

    La durée de vie d'une variable d'une méthode est-elle forcément limitée à l'appel de cette méthode ou peut-elle etre residuelle tant que le process parent tourne ?

    Merci @+

  13. #13
    Membre actif
    Profil pro
    aucune
    Inscrit en
    Juillet 2007
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Juillet 2007
    Messages : 134
    Points : 281
    Points
    281
    Par défaut
    La portée des variables est à apprendre dès le début en première année fac si je ne me trompe !

    Une variable déclarée dans une boucle while ne survit pas à la fin de ta boucle, de même une variable déclarée dans une fonction disparait à la fin de cette fonction.

    enfin je crois

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Ah ba voilà ! c'était bien et tu finis par un "je crois"
    Donc j'suis en effet d'accord avec toi pour la théroie... je me demandais juste dans le cas d'une programmation d'un process qui tourne en permanence avec une gestion de thread s'il était possible d'avoir des pertes de mémoire sur de simple déclaration de variables mal placées dans le code. Merci de ta participation en tout cas

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

Discussions similaires

  1. Détection de faille mémoires dans un programme java
    Par stacre dans le forum Tests et Performance
    Réponses: 3
    Dernier message: 09/02/2009, 13h10
  2. Gestion des droits dans une application Java
    Par Donaldo dans le forum Langage
    Réponses: 10
    Dernier message: 14/02/2008, 19h15
  3. Réponses: 13
    Dernier message: 14/02/2008, 14h27
  4. Réponses: 19
    Dernier message: 04/10/2006, 17h53
  5. Gestion de Mémoire Java
    Par lebulls dans le forum Langage
    Réponses: 5
    Dernier message: 18/07/2006, 11h35

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