Los literales de cadena no se almacenan en la pila. Nunca. De hecho, no se almacenan objetos en la pila.
Los literales de cadena (o más exactamente, los objetos de cadena que los representan) se almacenaron históricamente en un montón llamado montón "permgen". (Permgen es la abreviatura de generación permanente).
En circunstancias normales, los literales String y gran parte del resto del contenido del montón de permgen son accesibles "permanentemente" y no se recolectan como basura. (Por ejemplo, los literales de cadena siempre son accesibles desde los objetos de código que los usan). Sin embargo, puede configurar una JVM para intentar buscar y recolectar clases cargadas dinámicamente que ya no son necesarias, y esto puede hacer que los literales de cadena se recolecten como basura .
ACLARACIÓN # 1 - No estoy diciendo que Permgen no reciba GC'ed. Lo hace, normalmente cuando la JVM decide ejecutar un GC completo. Mi punto es que los literales de cadena serán accesibles siempre que el código que los usa sea accesible, y el código será accesible siempre que se pueda acceder al cargador de clases del código, y para los cargadores de clases predeterminados, eso significa "para siempre".
ACLARACIÓN # 2 - De hecho, Java 7 y versiones posteriores usan el montón regular para contener el grupo de cadenas. Por lo tanto, los objetos String que representan los literales String y las cadenas internas están en realidad en el montón normal. (Vea la respuesta de @ assylias para más detalles).
Pero todavía estoy tratando de encontrar una línea delgada entre el almacenamiento de literal de cadena y la cadena creada con new
.
No hay una "línea delgada". Es realmente muy simple:
String
los objetos que representan / corresponden a cadenas literales se mantienen en el grupo de cadenas.
String
los objetos que fueron creados por una String::intern
llamada se mantienen en el grupo de cadenas.
- Todos los demás
String
objetos NO se mantienen en el grupo de cuerdas.
Luego está la pregunta separada de dónde se "almacena" el grupo de cadenas. Antes de Java 7, era el montón de permgen. Desde Java 7 en adelante, es el montón principal.