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 la memoire en java


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 16
    Par défaut gestion de la memoire en java
    bonjours,
    Je me pose quelques petites questions sur la gestion des objets java en memoire et notement lorsque dans une boucle while on fait un new que deviennent les objets anterieurement crees avec le new, sont-ils detruit par le garbage collector, ou alors restent ils en memoire??? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(true)
    {
    classA ob1=new classA;
     
    }

  2. #2
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    à l'itération suivante les objets deviennent Zombie et, en temps utile, pourront être récupérés par le glaneur de mémoire.

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    En théorie, tu n'as pas besoin de te soucier de la mémoire et des zombies en java.

    En pratique, si tu ne veux pas faire fondre ton pc, ne fait jamais ce genre de choses.

    Essaye de réutiliser au maximum les variables, de faire le moins de new possible etc..

    l'idéal pour un cas comme ça serait qqch comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    classA ob1=new classA;
    while (true)
    {
      ob1.init(valeur que tu aurais mis dans le new)
      ...
    }
    Et dans ton init, tu nettoies et tu réutilises.

  4. #4
    Membre éprouvé Avatar de manube
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Mai 2004
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 180
    Par défaut
    Salut,

    Si je ne dis pas de betise, tu peux aussi assigner ta variable inutilisée à null, ca t'évitera d'avoir de "gros" objets zombies (utile essentiellement dans le cas ou tu as de grosses montées en charge mais la méthode de Faiche me semble la mieux)

    ++

  5. #5
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Pour compléter :

    Un objet est potentiellement détruit de la mémoire (si le garbage collector passe par là) s'il n'y a plus aucune référence à cet objet (en gros)

    Dans ton exemple ton objet est créé dans le bloc du while. ob1 n'existe que dans ce bloc, ce qui signifie que l'objet qu'il réfère est éligible pour le garbage collector une fois arrivé à la fin du while.
    Cet exemple ne pose pas un problème de mémoire mais de performance car un nouvel objet est créé à chaque fois.


    De manière général, en cas de doute sur le référencement des objets, faire un petit ob1=null quand on en a plus besoin peut améliorer la gestion de la mémoire, car l'objet (s'il n'est référencé nulle part ailleurs) devient allors éligible pour le gc.

  6. #6
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Citation Envoyé par Faiche
    En théorie, tu n'as pas besoin de te soucier de la mémoire et des zombies en java.

    En pratique, si tu ne veux pas faire fondre ton pc, ne fait jamais ce genre de choses.

    Essaye de réutiliser au maximum les variables, de faire le moins de new possible etc..

    l'idéal pour un cas comme ça serait qqch comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    classA ob1=new classA;
    while (true)
    {
      ob1.init(valeur que tu aurais mis dans le new)
      ...
    }
    Et dans ton init, tu nettoies et tu réutilises.
    Pas d'accord.

    un bon vieux
    while(){
    Obj obj = new Obj();
    ...
    }

    c'est le reve, c'est lisible propre etc...
    Et en plus la JVM va optimiser ca d'elle meme bien mieux que de sortir la variable de la boucle.
    L'optimisation de l'execution en Java consiste uniquement (presque) a bien penser sont code.

  7. #7
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    tu fais bien de dire qu'il faut bien penser son code.

    Java n'optimise pas du tout la gestion de la mémoire, il épargne juste à l'utilisateur d'y penser.

    Faire une alloc infinie d'un nouvel espace mémoire a chaque fois, pour un peu que ça aille vite et que ça prenne de la place, ça peut faire sauter le programme, tant en utilisation mémoire qu'en cpu.

    En plus, prendre ce genre de tres mauvaises habitudes empeche tout passage a un autre langage..

    Enfin, déclarer les variables partout dans le code, en terme de lisibilité, c'est pas le must.

    Après, c'est une question d'école de pensée, si on compte faire du java toute sa vie, et qu'on maitrise le gc, alors on fait comme on veut.

  8. #8
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Citation Envoyé par BainE
    Pas d'accord.

    un bon vieux
    while(){
    Obj obj = new Obj();
    ...
    }

    c'est le reve, c'est lisible propre etc...
    Et en plus la JVM va optimiser ca d'elle meme bien mieux que de sortir la variable de la boucle.
    L'optimisation de l'execution en Java consiste uniquement (presque) a bien penser sont code.
    Je peux pas laisser dire ça.
    Quand tu travailles sur de gros projets où la performance est importante, tu DOIS optimiser certaines choses.

    Petit exemple :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public class Test {
    	public int propriete1;
     
    	public Test() {
    	}
     
    	public void setPropriete1(int prop) {
    		propriete1 = prop;
    	}
     
    	public Test(int prop){
    		propriete1 = prop;
    	}
     
    	public static void main(String[] args) {
    		//un random histoire d'avoir des valeurs a setter
    		Random r = new Random();
     
    		//--------Test 1---------------
    		long time = System.currentTimeMillis();
    		for (int i=0;i<100000000;i++){
    			Test t = new Test(r.nextInt());
    		}
    		time -= System.currentTimeMillis();
    		System.out.println(time);
     
    		//--------Test 2-----------------
    		long time2 = System.currentTimeMillis();
    		Test t2 = new Test();
    		for (int i=0;i<100000000;i++){
    			t2.setPropriete1(r.nextInt());
    		}
    		time2 -= System.currentTimeMillis();
    		System.out.println(time2);
    	}
    }
    Et voici la sortie :
    Le résultat parle de lui même.
    Quand on doit faire d'énormes traitements, il faut optimiser un minimum. La JVM ne remplacera jamais l'optimisation humaine.

    La création d'objet est une des choses les plus lourdes en java. Il faut au maximum la sortir des boucles (quand on peut bien sûr, après c'est un compromis entre lisibilité et performance)

  9. #9
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    J'ai dit une enormité...
    Et bé j'ai du boulot a reprendre...
    Et sun pourrait faire un effort, je suis plus sur de rien mais il me semble que mes vieux compilo C font ce genre d'optimisation depuis un bail

  10. #10
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par BainE
    Pas d'accord.

    un bon vieux
    while(){
    Obj obj = new Obj();
    ...
    }

    c'est le reve, c'est lisible propre etc...
    Tu as confondu cet exemple et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Object o;
    while(condition) {
        o = new Object();
    }
    Là ça ne change rien niveau performances, c'est juste que la poignée vers l'objet o est définie une fois pour toute, et ça c'est optimisé par le compilo... Mais pas le new

  11. #11
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    ouaip c'est exactement ca, ca viens d'une discution (ecoute surtout pour moi) avec adiGuba et je me suis un peu emballé.

    Par contre va falloir que je test ce que ca donne en C ce soir, ca m'intrigue

Discussions similaires

  1. Gestion de la memoire
    Par deeal dans le forum C++/CLI
    Réponses: 8
    Dernier message: 14/11/2006, 14h20
  2. Gestion de la memoire central d'un PC
    Par Bass_Room dans le forum C
    Réponses: 7
    Dernier message: 22/10/2006, 15h02
  3. Consommation mémoire en java
    Par faico dans le forum Interfaces Graphiques en Java
    Réponses: 17
    Dernier message: 14/06/2006, 11h21
  4. Gestion de la mémoire.
    Par nicolas_faf dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 27/03/2006, 16h58
  5. [JVM]Gestion de la mémoire
    Par Crypt dans le forum Général Java
    Réponses: 20
    Dernier message: 31/12/2005, 14h33

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