2012-04-19 10 views
9

En Java,¿Qué pasa si el tamaño del grupo de cadenas excede?

literales de cadena en cadena piscina constante no son basura recogida, ya que se hace referencia en la tabla de referencias que se crea mediante instancia de tiempo de ejecución con el fin de optimizar el espacio.

Si el tamaño del conjunto literal String excede entonces, Dado que cada conjunto literal String in String tiene una referencia, por lo tanto, no será elegible para GC. cómo es manejado por JVM?

+2

Las cadenas en el conjunto constante * pueden * ser basura si son ya no es necesario (es decir, las clases que las colocan allí están descargadas). –

+0

Si el tamaño del grupo de cadenas excede * ¿qué? – EJP

Respuesta

3

Los literales de cadena se pueden recopilar cuando ya no son necesarios. Por lo general, esto no es un problema si aparecen en las clases porque existen otros límites que es probable que alcance si intenta cargar muchas clases, p. Perm máximo Gen.

En términos generales, los desarrolladores son lo suficientemente inteligentes como para no utilizar el conjunto literal de cadenas y utilizar bases de datos o archivos para cargar la mayor parte de sus datos si no es un tamaño trivial.

Puede presentar un problema si utiliza String.intern() mucho en un intento de optimizar el espacio de su sistema. String.intern() no es gratuito y se vuelve cada vez más costoso si agrega un gran número (millones) de cadenas en él. Si se trata de un problema de rendimiento, debe ser razonablemente obvio para el desarrollador cuando lo es.

10

Hay una larga discusión con ejemplos de código real en JavaRanch.

La salida general es el siguiente: basura

  1. Si se añade una cadena a la piscina constante en tiempo de ejecución utilizando String.intern(), se puede ser recogido después de que ya no está en uso. Lo más probable es que el grupo de cadenas solo conserve referencias suaves a las cadenas agregadas, lo que permite recolectarlas (no puedo estar seguro, porque String.intern() es un método nativo).
  2. Si una cadena es una constante de tiempo COMPIL, se agrega al conjunto constante de la clase correspondiente. Por lo tanto, puede ser basura recolectada solo después de que la clase está descargada.

La respuesta a su pregunta es: la única manera de cómo se puede obtener OutOfMemoryError causa de constantes de cadena es cargar mucho de la de las clases con muchas cadenas literales calculadas en tiempo de compilación. Entonces eventualmente puede exceder el tamaño máximo del espacio PermGen. Pero esto sucederá cuando cargue las clases en la memoria (por ejemplo, inicie su aplicación, implemente un proyecto en un servidor web, cargue nueva biblioteca dinámicamente, etc.)

Cuestiones relacionadas