¿Cuándo se recolectará una cadena de basura en java?

En Java, cuando un objeto no tiene referencia en vivo, es elegible para recolección de basura. Ahora, en el caso de una cadena, este no es el caso porque la cadena irá al grupo de cadenas y JVM mantendrá el objeto vivo para que se vuelva a utilizar. ¿Entonces eso significa que una cadena una vez creada nunca será recolectada?

Ahora, en el caso de una cadena, este no es el caso porque la cadena irá al grupo de cadenas y JVM mantendrá el objeto vivo para que se vuelva a utilizar. ¿Entonces eso significa que una cadena una vez creada nunca será recolectada?

Primero, solo los literales de cadena 1 son automáticamente internados / agregados al grupo de cadenas. Las cadenas creadas por una aplicación no se internan … a menos que su aplicación llame explícitamente a String.intern() .

En segundo lugar, de hecho, las reglas para los objetos recolectores de basura en el conjunto de cadenas son las mismas que para otras cadenas u otros objetos. Las cuerdas serán basura recolectada si alguna vez se vuelven inalcanzables.

En la práctica, los objetos String que corresponden a los literales String normalmente no se vuelven candidatos para la recolección de basura. Esto se debe a que hay una referencia implícita al objeto de cadena en el código de cada método que usa el literal. Esto significa que la Cadena es alcanzable por el tiempo que el método pueda ejecutarse.

Sin embargo, este no es siempre el caso. Si el literal se definió en una clase que se cargó dinámicamente (por ejemplo, utilizando Class.forName(...) ), entonces es posible organizar que la clase se descargue . Si eso sucede, entonces el objeto String para el literal será inalcanzable, y será recuperado cuando el montón que contiene el String interno obtenga GC.


1 – Es incorrecto decir que todos los literales de cadena están internados. Si un literal String solo aparece en el código fuente como una sub-expresión de una expresión constante (en tiempo de comstackción) ( JLS 15.28 ), entonces el literal no aparecerá en el archivo “.class” en ninguna forma . Tal literal no será internado porque no existirá en tiempo de ejecución.

Estás en lo correcto; las cadenas en el grupo interno nunca serán GC’d.

Sin embargo, la mayoría de las cuerdas no están internados.
Los literales de cadena están internados, y las cadenas pasadas a String.intern() están String.intern() , pero todas las demás cadenas no están intercaladas y pueden ser GC’d normalmente.