2010-02-04 8 views
5

J'ai quelques doutes concernant les StringsGarbage Collection et Strings

Vivent-ils sur Heap ou String pool?

Et si sur Heap alors ils seront collectés par le garbage, s'ils ne sont pas joignables par n'importe quel thread vivant.

Et si sur le pool de chaînes, alors comment ils seront supprimés ou supprimés car, comme nous le savons, la récupération de place se produit uniquement sur heap.

Répondre

8
String s = new String("abc"); 

l'objet chaîne visé par s sera sur tas et la chaîne « abc » sera dans la piscine de chaîne. Les objets du pool de chaînes ne seront pas collectés. Ils sont là pour être réutilisés pendant la durée du programme, pour améliorer les performances.

+0

Si vous faites référence à la pool_ de _constant qui fait partie de la définition de la classe, alors vous _can_ déchargez la piscine constante, à condition que vous pouvez décharger la classe (ce qui nécessite normalement déréférencement le chargeur de classe et toutes les références à sa charge Des classes). Plus difficile que votre programme typique, mais Tomcat le fait. –

4

Ils sont tous stockés dans le tas, mais les chaînes intern() ées (y compris les chaînes littérales dans la source) sont référencées d'une piscine dans la classe String. Si elles apparaissent en tant que littéraux dans le code source, y compris les expressions de chaîne constante (par exemple "a" + "b"), elles seront également référencées à partir du Class, ce qui signifie généralement qu'elles dureront aussi longtemps que le processus s'exécute.

Modifier: Lorsque vous appelez intern() sur une chaîne dans votre code, il est également ajouté à cette piscine, mais parce qu'il utilise des références faibles de la chaîne peut être encore ordures collectées si elle n'est plus utilisé.

Voir aussi: interned Strings : Java Glossary

Citation de cet article:

La collection de chaînes enregistrés dans ce HashMap est parfois appelé la piscine à cordes. Cependant, ils sont des objets ordinaires et vivent sur le tas comme les autres (peut-être d'une manière optimisée puisque les chaînes internes ont tendance à être de longue durée).

0

cordes Alex va dans la piscine littérale, y reste aussi longtemps que le processus se déroule (ou l'application Web reste chargée.) Comme dit par finnw et ne sont jamais les déchets ramassés. String name2 n'alloue pas de mémoire pour "Alex" et le réutilise dans le pool littéral. PS: La piscine littérale est sur le tas aussi bien.

Pour la chaîne John deux objets sont créés avec le nom de référence 3 et le nom4 qui sont garbage collectible.

String name = "Alex"; 
String name2 = "Alex"; 

String name3 = new String("John"); 
String name4 = new String("John");