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 :

Comment bien déclarer les string et gestion de la mémoire.


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2006
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 707
    Par défaut Comment bien déclarer les string et gestion de la mémoire.
    Bonjour,

    Généralement, comme le garbage collector ne voit que les objet instancié par new, je déclare les string comme ça lorsque je sais que le String peut être effacer par le garbage collector.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new String ("Hello")
    Pour les String globaux qui ne sont pas effacé et ceux qui sont utilisé à plusieurs endroits, je les déclare comme ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "Clients".intern();
    Mais quand j'étais en formation, on m'a dis de déclarer les String comme ça ?

    Est-ce que la première façon d'écrire donne bien au garbage collector l'indication qu'il peut détruire le String ?

    Comment fonctionne exactement les chaine de caractère en java et en particulier le dictionnaire .intern() ?

    Concernant la gestion de la mémoire est-il préférable d'initialiser les propriéter directement ou dans le constructeur ?

    Est-il préférable de déclarer des instance sous forme de variables locale et, dans la mesure du possible, des instance non nommée ?

    Quand on ajoute un objet à une fenêtre, est-il correcte de dire que celui-ci ne peut être "garbage collecté" ?

    Merci de me renseigner

    Salutations

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ta façon est inutile. Au lieu de créer une String, tu en crée deux. Le seul cas que je connaisse où l'appel au constructeur explicite a un intérêt, c'est quand on veux la garantie de deux instances distinctes de la même chaîne.
    Le garbage collector nettoie les objets lorsque ceux-ci ne sont plus référencés.

    Les chaines constantes dans ton code seront instanciées et traitées via le mécanisme intern() puis associées à la définition de la classe. Tant que la définition de classe restera en mémoire, la string restera en mémoire, ce qui est logique et nécessaire .

    Le mecanisme intern() et à utiliser si tu veux avoir la garantie que deux String ayant le même contenu utilisent la même instance. Ce n'est utilisé que quand tu as de fortes suspicions qu'il est possible qu'une autre String soit la même. Les constantes de ton code passent dedans parce que, justement, on suspecte qu'elles seront utilisées plusieurs fois

    Enfin, intern() n'empêche pas le garbage collector. Il maintient sa liste de String via des WeakReference.

    Ainsi si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String tresLong = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    for (long i = 0; i < Long.MAX_VALUE; i++){
        String temp = tresLong + i;
        temp.intern();
    }
    Il n'y aura pas de out of memory. Le gc fera son travail.


    String

  3. #3
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    J'ai lu avec attention ta réponse. Et je pensais qu'il n'était pas possible de créer 2 instances distincte de la même chaîne, que justement le mécanisme mis en place par intern() permet de garantir cela et d'instancier un minimum de string et d'économiser la mémoire.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Seules les string constantes sont passées par la jvm à intern(), les autres non. Passer dans intern() coute du temps, car il faut comparer la string avec celles stockées dans ce tableau.

    La doc mentionne clairement que toutes les constantes String et les litéraux String sont internalizé. Pour plus de détails http://java.sun.com/docs/books/jls/html/ section 3.10.5


    voici un exemple qui montre plusieurs String ayant le même contenu mais pas nécessairement la meme instance


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	     String s1 = "Hello";
    	     String s2 = "Hello";
    	     String s3 = "Hell"+"o";
    	     String s4 = new String("Hello");
    	     String s5 = new StringBuilder().append(s1).toString();
    	     char[] tableau =  {'H','e','l','l','o'};
    	     String s6 = new String(tableau); 
    	     System.out.printf("String '%s' at address 0x%X\n",s1,System.identityHashCode(s1));
    	     System.out.printf("String '%s' at address 0x%X\n",s2,System.identityHashCode(s2));
    	     System.out.printf("String '%s' at address 0x%X\n",s3,System.identityHashCode(s3));
    	     System.out.printf("String '%s' at address 0x%X\n",s4,System.identityHashCode(s4));
    	     System.out.printf("String '%s' at address 0x%X\n",s5,System.identityHashCode(s5));
    	     System.out.printf("String '%s' at address 0x%X\n",s6,System.identityHashCode(s6));
    sortie:
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String 'Hello' at address 0x1D9F953D
    String 'Hello' at address 0x1D9F953D
    String 'Hello' at address 0x1D9F953D
    String 'Hello' at address 0x2586DB54
    String 'Hello' at address 0x38A97B0B
    String 'Hello' at address 0x7ECD2C3C

Discussions similaires

  1. Comment bien gérer les variables de session ?
    Par rad_hass dans le forum ASP.NET
    Réponses: 4
    Dernier message: 29/04/2008, 10h14
  2. Réponses: 3
    Dernier message: 29/05/2007, 16h50
  3. [Include/Require] Comment bien gérer les chemins ?
    Par Wookai dans le forum Langage
    Réponses: 1
    Dernier message: 11/04/2007, 09h11
  4. Comment bien gérer les utilisateurs multiples
    Par Vesta dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/06/2006, 08h48
  5. [JDesktopPane] Comment bien gérer les JInternalFrame ?
    Par calogerogigante dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/04/2006, 12h45

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