Les chaînes de caractères ne sont pas stockées sur la pile. Jamais. En fait, aucun objet n'est stocké sur la pile.
Les littéraux de chaîne (ou plus précisément, les objets Chaîne qui les représentent) son étaient historiquement stockés dans un tas appelé le tas "permgen". (Permgen est l'abréviation de génération permanente).
Dans des circonstances normales, les littéraux String et la plupart des autres éléments du tas permgen sont accessibles "en permanence" et ne sont pas collectés. (Par exemple, les littéraux String sont toujours accessibles à partir des objets de code qui les utilisent). Cependant, vous pouvez configurer une JVM pour qu'elle tente de trouver et de collecter les classes chargées dynamiquement qui ne sont plus nécessaires, ce qui peut entraîner la collecte des littéraux String.
CLARIFICATION #1 - Je ne dis pas que Permgen n'a pas de CG. Il l'est, généralement lorsque la JVM décide d'exécuter une GC complète. Ce que je veux dire, c'est que String littéraux seront accessibles tant que le code qui les utilise sera accessible, et le code sera accessible tant que le classloader du code sera accessible, et pour les classloaders par défaut, cela signifie "pour toujours".
CLARIFICATION #2 - En fait, Java 7 et les versions ultérieures utilisent le tas régulier pour contenir le pool de chaînes. Ainsi, les objets String qui représentent les littéraux String et les chaînes internées sont en fait dans le tas régulier. (Voir la réponse de @assylias pour plus de détails).
Mais j'essaie toujours de trouver la frontière entre le stockage d'une chaîne de caractères littérale et une chaîne de caractères créée avec l'option new
.
Il n'y a pas de "ligne fine". C'est vraiment très simple :
-
String
Les objets qui représentent / correspondent aux littéraux de chaîne sont conservés dans le pool de chaînes.
-
String
qui ont été créés par un String::intern
sont détenus dans le pool de cordes.
- Tous les autres
String
ne sont PAS conservés dans le pool de chaînes.
Il y a ensuite la question distincte de savoir où le pool de chaînes de caractères est "stocké". Avant Java 7, il s'agissait du tas permgen. À partir de Java 7, il s'agit du tas principal.
13 votes
Comment un pool peut-il être stocké sur la pile ? Connaissez-vous le concept de pile ?
1 votes
Salut Scrum Meister, j'ai essayé de dire que ce n'est pas possible. Désolé pour la mauvaise convention. En ce qui concerne GC, c'est maintenant que je le sais. Merci pour cela
0 votes
@TheScrumMeister - en fait, dans certaines circonstances, ils peut être Les déchets sont collectés. Le problème est que l'objet de code de toute classe qui mentionne un littéral de chaîne de caractères aura une référence à l'objet String qui représente le littéral.