Les littéraux de chaîne ne sont pas stockés 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 String qui les représentent) sont 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 de chaîne et la plupart des autres éléments du tas permgen sont accessibles "en permanence" et ne sont pas récupérés. (Par exemple, les littéraux de chaîne sont toujours accessibles à partir des objets de code qui les utilisent.) Cependant, vous pouvez configurer une machine virtuelle Java pour tenter de trouver et de collecter des classes chargées dynamiquement qui ne sont plus nécessaires, ce qui peut entraîner la récupération des déchets de littéraux de chaîne. .
CLARIFICATION # 1 - Je ne dis pas que Permgen n'obtient pas GC. C'est le cas, généralement lorsque la JVM décide d'exécuter un GC complet. Mon point est que les littéraux de chaîne seront accessibles tant que le code qui les utilise est accessible, et le code sera accessible tant que le chargeur de classe du code est accessible, et pour les chargeurs de classe par défaut, cela signifie "pour toujours".
CLARIFICATION # 2 - En fait, Java 7 et les versions ultérieures utilisent le tas normal pour contenir le pool de chaînes. Ainsi, les objets String qui représentent les littéraux String et les chaînes internes sont en fait dans le tas normal. (Voir la réponse de @ assylias pour plus de détails.)
Mais j'essaie toujours de découvrir la ligne mince entre le stockage de la chaîne littérale et la chaîne créée avec new
.
Il n'y a pas de «ligne fine». C'est vraiment très simple:
String
les objets qui représentent / correspondent à des chaînes littérales sont conservés dans le pool de chaînes.
String
les objets créés par un String::intern
appel sont conservés dans le pool de chaînes.
- Tous les autres
String
objets ne sont PAS contenus dans le pool de chaînes.
Ensuite, il y a la question distincte de savoir où le pool de chaînes est "stocké". Avant Java 7, c'était le tas permgen. À partir de Java 7, c'est le tas principal.