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 :

Mieux connaître fonctionnement classe String


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut Mieux connaître fonctionnement classe String
    Bonjour, (surtout n'hésitez pas à me corrigé car il se peut que cela soit moi qui ai mal compris)

    Je me pose une question sur la classe String de Java. Notre prof nous à dit que lorsque l'on créé une instance de cette classe et que l'on change la valeur par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String ch = "toto";
    ch = "titi";
    La chaîne "toto" n'est pas effacé mais est gardé en mémoire (alors déjà est-ce dans le tas ou dans la pile ?) et recréé une instance contenant la chaine "titi" puisque c'est un objet non mutable.
    Mais si à chaque fois que je change ma String "ch", l'ancienne valeur est resté en mémoire cela peut prendre énormément de place et surtout cela n'est pas très sécurisé car je suis sur qu'un petit malin peut malgré tout allé fouillé dans la mémoire pour trouvé toutes les valeurs de "ch". Et que donc il fallait mieux utiliser des StringBuffer à la place des String.

    Alors je voudrais savoir si cela est vrai mais surtout avoir plus de détail et d'explications sur ce fonctionnement car je n'ai rien trouvé sur le net

    Merci d'avance

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Par défaut
    Le garbage collector s'occupe des String comme n'importe quel objet
    sauf dans un cas particulier : http://bugs.sun.com/bugdatabase/view...bug_id=4513622

    Sinon pour éviter les doublons de string en mémoire, tu as la méthode intern() :
    http://java.sun.com/j2se/1.4.2/docs/....html#intern()

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Et bien apparemment si je fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String ch;
      for (int i = 0; i<10; i++)
        ch += i;
    Il y a autant d'instance d'instances de String que de tour de boucle qui est créé et cela m'étonnerais que le GC passe à chaque tour de boucle pour effacer la précédente valeur. Donc ces valeurs doivent bien être quelques part ? et c'est tout de même dangereux car à tout les coups on doit pouvoir y accéder à ces valeurs non changé. Ce que j'aimerais donc c'est plus de détail sur le fonctionnement des String par Java et pas un lien pour évité ça (on peut y remédier en utilisant plus des String mais des StringBuffer) même si le lien du bug était intéressant. Merci

  4. #4
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 688
    Par défaut
    Les objets sont toujours alloués sur le tas. Seuls les types primitifs et les références sont alloués sur la pile.

    Le garbage collector ne libèrera pas les chaines immédiatement, mais par paquets, à intervalle régulier, comme tout objet qui n'a plus aucune référence qui pointe sur lui.
    Donc les chaines ne resteront pas en mémoire indéfiniment.

    Je ne pense pas que se soit un gros risque de sécurité supplémentaire, car si tu peux accéder à cette valeur, ça veux dire que tu as le moyen de consulter directement la mémoire de ta machine. Donc que tu peux tout aussi bien récupérer la valeur avant qu'elle ait été effacée.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Ok merci bien de ces précisions. Mais si le GC les effaces par paquets cela peut faire de grosses fuites mémoire non ? enfin je sais pas si on peut parlé de fuite mémoire en Java...

  6. #6
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 688
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 688
    Par défaut
    C'est sur que la consommation mémoire de Java a un instant donné est moins prévisible qu'en C ou l'on sait exactement quand et combien de mémoire est allouée/libérée.

    Mais on ne peut pas parler de fuite mémoire, vu que la mémoire sera bien libérée, il y a juste un léger délai de retard qui n'est normalement pas gênant. Il y a fuite mémoire si tu gardes une référence vers des objets que tu n'utilises plus, car là le GC ne saura pas les libérer.

    L'algorithme du GC de java n'est pas mauvais et la mémoire est libérée avant que ça devienne gênant. Enfin, si jamais la mémoire venait à manquer, un GC sera effectué de force.

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

Discussions similaires

  1. [VB.NET]petit problème avec la classe string !!
    Par zouhib dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/06/2006, 11h58
  2. Question facile sur la classe string
    Par MarOne dans le forum Langage
    Réponses: 9
    Dernier message: 20/04/2006, 14h28
  3. la classe string
    Par amel2006 dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2006, 16h11
  4. [C++]la classe String
    Par bechbech dans le forum MFC
    Réponses: 5
    Dernier message: 01/04/2006, 15h35
  5. Fuite mémoire de la classe string
    Par jean_barac dans le forum SL & STL
    Réponses: 7
    Dernier message: 28/07/2005, 23h12

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