2010-02-04 6 views
5

Tengo algunas dudas con respecto a las cadenasRecogida de basuras y cadenas

¿Están en vivo en el grupo Heap o String?

Y si están en Heap entonces serán basura, si no son accesibles por ningún hilo en vivo.

Y si está en el grupo de cadenas, cómo se eliminarán o eliminarán porque, como sabemos, la recolección de basura solo se realiza en el montón.

Respuesta

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

el objeto de cadena referido por s será en el montón y el literal "abc" cadena estará en grupo de cadena. Los objetos en el grupo de cadenas no serán recolectados. Están allí para ser reutilizados durante la vida útil del programa, para mejorar el rendimiento.

+0

Si se refiere a la pool_ _constant que es parte de la definición de clase, entonces _es descargado la piscina constante, siempre se puede descargar la clase (que normalmente requiere la eliminación de referencias del cargador de clases y todas las referencias a que es cargada clases). Más difícil que tu programa típico, pero Tomcat lo hace. –

4

todos ellos son almacenado en el montón, pero intern() cadenas ED (incluyendo los literales de cadena en la fuente) son referenciados de una piscina en la clase String.

Si aparecen como literales en el código fuente, incluidas las expresiones de cadena constante (por ejemplo, "a" + "b"), también se hará referencia a ellas desde el Class, lo que generalmente significa que durarán mientras se ejecuta el proceso.

Editar: Cuando se llama a intern() en una cadena en su código también se agrega a esta piscina, pero debido a que utiliza referencias débiles de la cadena puede todavía pueden recoger la basura si ya no está en uso.

Consulte también: interned Strings : Java Glossary

Presupuesto de ese artículo:

La colección de cadenas registradas en este HashMap a veces se llama el grupo de cadena. Sin embargo, son Objetos ordinarios y viven en el montón como cualquier otro (quizás de una manera optimizada ya que las Cadenas internas tienden a ser de larga duración).

0

cadena Alex entra en la piscina literal, permanece allí mientras se ejecuta el proceso (o la aplicación web permanece cargado.) Según lo dicho por finnw y nunca es basura recogida. String name2 no asigna memoria para "Alex" y la reutiliza desde el grupo literal.

PD: El grupo literal también está en el montón.

Para la cadena John se crean dos objetos con la referencia name3 y name4 que son artículos de colección.

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

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