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 :

[JVM]Gestion de la mémoire


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 56
    Points : 24
    Points
    24
    Par défaut [JVM]Gestion de la mémoire
    Je m'interroge sur des questions de performances de mon projet actuel.

    C'est sans doute une question de base mais je la pose quand même =

    par exemple

    String st=new String("ttt");

    utilise t'il plus de mémoire que

    new String("ttt");

    ?

  2. #2
    HNT
    HNT est déconnecté
    Membre actif Avatar de HNT
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    448
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 448
    Points : 293
    Points
    293
    Par défaut
    Ben c'est simple le premier cas utilise plus de mémoire mais est le seul correct ! il utilise plus de mémoire parce-qu'il crée une reférence (ou pointeur) nommé st. Ce n'est en fait qu'une variable qui contient une adresse, celle de début (en mémoire) de l'objet que tu référence. Les références sont indispensable car ce sont elles qui te permettent d'accéder à tes objets par conséquent si tu te contente d'écrire
    new String ("ttt");
    il est vrai que tu économisera l'espace mémoire d'une référence mais ou est l'intéret vus que tu ne saura jamais accéder à cet objet ? Je n'ai jamais essayé mais logiquement ca ne devrait pas passé la compilation (tel quel en tout cas, si tu écrit System.out.print(new String("ttt")) c'est bon mais ca implique que tu ne puisse utilisé nul part ailleurs la chaine ttt)

  3. #3
    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
    Points : 3 675
    Points
    3 675
    Par défaut
    Hello,

    sur le principe ce n'est pas faux, mais je complèterai en disant ceci:

    il n'y a pas de problème à instancier des objets sans garder leurs références à portée de main... c'est très fréquent et lorsqu'il ne s'agit que d'objets intermédiaires utilisés à 1 seul endroit cela permet de simplifier le code.

    Cependant, la classe String, dans la plupart des JVM, gère un pool de chaînes en interne: quand on écrit "toto", il n'y a pas forcément de nouvelle chaîne créée en mémoire, si une chaîne "toto" existe déjà dans la mémoire cela renvoie sa référence... en instanciant explicitement les chaînes, on court-circuite cette optimisation en forçant la création d'une nouvelle chaîne...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // sur des JVM récentes 
    String s1 = "toto";
    String s2 = "toto";
    System.out.println(s1 == s2); // true
     
    s2 = new String("toto");
    System.out.println(s1 == s2); // false !

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Sauf qu'en général il vaut mieux éviter d'utiliser le == sur des chaines sauf pour du null

  5. #5
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    L'utilisation de == est parfaite ici pour demontrer ce que disait Pill_S. La methode equals() ne prouverait rien.

  6. #6
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    je ne remettais pas en cause l'utilisation dans le cas présent, mais apportait juste une précision, quend on voit le nombre d'erreurs qui résultent de la confusion .......

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 56
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par HNT
    Ben c'est simple le premier cas utilise plus de mémoire mais est le seul correct ! il utilise plus de mémoire parce-qu'il crée une reférence (ou pointeur) nommé st. Ce n'est en fait qu'une variable qui contient une adresse, celle de début (en mémoire) de l'objet que tu référence. Les références sont indispensable car ce sont elles qui te permettent d'accéder à tes objets par conséquent si tu te contente d'écrire
    new String ("ttt");
    il est vrai que tu économisera l'espace mémoire d'une référence mais ou est l'intéret vus que tu ne saura jamais accéder à cet objet ? Je n'ai jamais essayé mais logiquement ca ne devrait pas passé la compilation (tel quel en tout cas, si tu écrit System.out.print(new String("ttt")) c'est bon mais ca implique que tu ne puisse utilisé nul part ailleurs la chaine ttt)

    ça ne se voit pas dans les exemples que je donnais mais en fait ça a un intéret : au moment de la génération d'un terrain pour un jeu je crée des objets de divers type que je stocke ensuite dans une grille.
    Les objets sont ensuite accessibles dans la grille.

    donc au lieu de faire =

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Door truc=new Door("Une porte",false,150,false,false,
    	"standarddoor","Gate",true,"./images/doors/door0.gif",
    	"./images/doors/openDoor0.gif","./images/walls/roomWall33.gif",
    	"./sons/door_open.wav","./sons/door_close.wav");
     
    grille[17][26].add(truc);


    je peux faire =

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    grille[17][26].add(new Door("Une porte",false,150,false,false,
    	"standarddoor","Gate",true,"./images/doors/door0.gif",
    	"./images/doors/openDoor0.gif","./images/walls/roomWall33.gif",
    	"./sons/door_open.wav","./sons/door_close.wav"));

    et économiser de la mémoire.

    Merci à tous pour vos réponses.

  8. #8
    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 Crypt
    et économiser de la mémoire.
    Tu n'économises pas de la mémoire puisque la référence de l'objet est stocké dans grille[17][26].

    Et de toute manière il s'agit d'une simple référence ce qui ne représente quasiment rien... Si tu as des problème de mémoire il y a peu de chances de cela vienne de là...

    a++

    PS : j'ai édité ton message pour ajouter les balises [code] et mettre des saut de ligne dans le code afin de rendre le tout plus lisible

  9. #9
    Membre éclairé
    Avatar de Floréal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    456
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 456
    Points : 849
    Points
    849
    Par défaut
    Je profite de ce post pour demander si en java il est possible d'écrire des destructeurs. J'ai éssayé d'en écrire un comme en C++, mais ca n'a pas plus au compilateur. J'ai rien trouvé concernant les destructeurs dans les FAQs alors je pose la question ici (peut être pas regardé suffisemment attentivement).

  10. #10
    Membre régulier Avatar de Buch'
    Inscrit en
    Avril 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 61
    Points : 73
    Points
    73
    Par défaut
    normal le garbage collector est là pour çà

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Buch'
    normal le garbage collector est là pour çà
    il me semble que le garbage collector ne fait pas tout (fermeture des connexions réseaux, de fichier,ect...), la methode finalize() peut etre utilisée.
    Quand a sa reel utilité .... euuuh

  12. #12
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    En regle generale il ne faut pas utiliser finalize() car on ne peut pas prevoir quand elle sera invoquee. Bref, le garbage collector fait tout mais cela n'empeche pas les fuites memoires dans des cas bien particuliers (mais tres rares).

  13. #13
    Membre chevronné Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 234
    Points : 1 897
    Points
    1 897
    Par défaut
    Pour que gc() fasse sont travail, il est bien de mettre son objet à null quand il n'est pas utilisé.

    Quand aux références des objets, il n'est pas toujours utiles de les écrire en dur : il suffit de les placer dans un conteneur comme un tableau.
    Cela permet de coder sans mentions explicites et d'écrire des programmes bien plus dynamiques (ou plus adaptatifs face aux différentes situations).

    Enfin, le méthode finalize() est au moins appelée lors de la fermeture de l'application : cela permet par exemple de fermer les ports encore ouverts en y plaçant dedans le code approprié.

    A+.

  14. #14
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Pour que gc() fasse sont travail, il est bien de mettre son objet à null quand il n'est pas utilisé.
    Non.

    Enfin, le méthode finalize() est au moins appelée lors de la fermeture de l'application : cela permet par exemple de fermer les ports encore ouverts en y plaçant dedans le code approprié.
    Non plus.

    Cf ici : http://www-128.ibm.com/developerworks/java/library/j-jtp01274.html

  15. #15
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 738
    Points
    3 738
    Par défaut
    Citation Envoyé par Mister Nono
    Pour que gc() fasse sont travail, il est bien de mettre son objet à null quand il n'est pas utilisé.
    non, c'est une legende urbaine. ca n'aide en rien (y'a un article d'ibm la dessus, mais je sais plus ou)

  16. #16
    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
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par lunatix
    non, c'est une legende urbaine. ca n'aide en rien (y'a un article d'ibm la dessus, mais je sais plus ou)
    le fait de placer des références à null ne va pas libérer l'objet directement...

    seulement, si l'on garde des références obsolètes dans tous les coins, cela va empêcher le gc de faire son travail... en les mettant à null, on favorise la libération de mémoire au plus vite... dans certains cas cela peut être utile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Object o = new VeryBigObject(); // big o
    ...
     
    for(int i=0; i<Integer.MAX_VALUE; i++)
      process(i);
     
    o = null; // o est libéré mnt, on aurait pu le faire avant...

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 56
    Points : 24
    Points
    24
    Par défaut
    Pour mes soucis de mémoire j'ai localisé une brouette entière d'instances inutiles. (pour un jeu, dans un tableau à deux dimensions d'ArrayLists, je remplissais le terrain avec des objets Sol et Herbe en créant à chaque fois une instance de ces objets pour chaque case alors que je n'avais besoin que d'en créer un seul)
    (c'est un rogue like =)
    http://cryptmaster.free.fr/cryptrl/crl116.jpg


    Toutefois il y a un truc que j'aimerais bien savoir = le developpeur de son côté peut augmenter la mémoire de sa JVM * , soit, mais qu'en est-il de l'utilisateur standard qui n'a installé que le minimum indispensable pour faire tourner des appli java et qui n'a probablement pas envie de se taper de la config en plus ?
    J'ai cru comprendre qu'il n'existait pas de moyen d'augmenter cette mémoire attribuée à la JVM en passant directement par le code, ce que je trouve assez curieux. Me trompe-je ?



    * ce que je n'arrive d'ailleurs pas à faire. J'ai bien essayé dans l'invite de commandes de manipuler des -Xms et autres -Xmx mais sans succés.
    Actuellement ma JVM est limitée à 64mo. Pour l'instant ça n'est pas génant mais on ne sait jamais ça pourrait le devenir par la suite.

  18. #18
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Je parle des flags -Xmx etc. ici : http://www.progx.org/index.php?section=replies&newsid=314

    Ne confonds pas la memoire utilisee, la memoire virtuelle, la memoire allouee au heap, etc. Une application Java augmentera la memoire utilisee tant que cela restera entre les valeurs limites du heap. C'est tres rare de devoir modifier ses valeurs et c'est souvent signe d'un gros probleme dans le code.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 56
    Points : 24
    Points
    24
    Par défaut
    Une application Java augmentera la memoire utilisee tant que cela restera entre les valeurs limites du heap.

    a priori, si j'ai bien compris,c'est le heap de ma JVM qui est actuellement limité à 64Mo.

  20. #20
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Modifie simplement le fichier de lancement de ton application (.sh, .bat, .exe ou que sais-je) pour augmenter la limite superieure du heap.

    Je te conseille de lire egalement ceci :
    http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
    http://java.sun.com/docs/hotspot/VMOptions.html

    Tout depend en fait de ta JVM. Avec une JVM 1.4 la valeur par defaut est de 64 Mo si je me souviens bien, mais la JVM 1.5 utilise 1/64 de la memoire totale disponible pour Xms et 1/4 pour Xmx (cf ici http://java.sun.com/docs/hotspot/gc5.0/ergo5.html)

Discussions similaires

  1. Bug JVM - gestion des sockets
    Par boby62423 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 18/02/2010, 10h26
  2. JVM Probleme gestion mémoire
    Par quiquekoi dans le forum Langage
    Réponses: 17
    Dernier message: 18/12/2008, 10h14
  3. Gestion de la memoire : JVM et windows
    Par biozaxx dans le forum Langage
    Réponses: 8
    Dernier message: 19/02/2008, 18h10
  4. [JVM]Gestion mémoire : Bizarre
    Par elitost dans le forum Général Java
    Réponses: 2
    Dernier message: 28/09/2005, 21h34
  5. gestion d'un joystick ...
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 13h53

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