2009-06-26 18 views
18

Recientemente he leído acerca de todos los argumentos de JVM disponibles en JRE 6 [Java VM Options] y vi esta:JVM -XX: + argumento StringCache?

-XX: + StringCache: Permite el almacenamiento en caché de cadenas comúnmente asignados.

ahora estaba siempre bajo la impresión de que Java mantuvo un grupo de internados (palabra correcta?) Cuerdas y cuando se hace algo así como la concatenación de cadenas con literales que no estaba creando nuevos objetos, pero tirando de ellos de esta piscina. ¿Alguien ha usado alguna vez este argumento, o puede explicar por qué sería necesario?

EDIT: Intenté ejecutar un punto de referencia, para ver si este argumento tenía algún efecto y no fue capaz de lograr que Sun JVM lo reconociera. Esto fue con:

java version "1.6.0_11" 
Java(TM) SE Runtime Environment (build 1.6.0_11-b03) 
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, 
sharing) 

Así que no estoy seguro de si este argumento funciona en absoluto.

+2

creo que la mayoría de las operaciones de cadena no utilizan la internación. La JVM utiliza bastante el interrogatorio para almacenar valores de cadena de los archivos de clase y evitar el consumo excesivo de memoria debido a duplicados. – akarnokd

+0

Gran pregunta. Los documentos del sol no están muy claros aquí. Sin embargo, los documentos sobre el internamiento son claros de que solo operan bajo circunstancias específicas (literales de cadena) por lo que quizás el argumento JVM aplique este comportamiento en un conjunto más amplio de circunstancias. –

+0

No puedo encontrar esta opción en el código fuente de OpenJDK. ¿Qué supones que significa? –

Respuesta

0

No he podido encontrar una sola JVM que incluso acepte este supuesto argumento, así que supongo que no hay mucho más que decir.

+0

Oracle JRocket 6;) http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionXX.html –

+3

Necesita -XX: + AggressiveOpts para habilitar muchas de las opciones extrañas, -XX : + UseStringCache incluido. Aquí está la referencia: http://mail.openjdk.java.net/pipermail/jdk7-dev/2011-April/002024.html – bestsss

6

Creo que cuando se utiliza con -XX:+AggressiveOpts y facilita el mismo String objetos a ser devuelto al crear la String con el mismo texto (aunque no a través de new String, por supuesto). Hay una fase de perfil donde se crea una caché y, después de un punto, la memoria caché se cambia a solo lectura. Obtiene puntajes más altos en ciertos puntos de referencia.

1

Yo tampoco pude hacer funcionar lo anterior, pero el último JBB @ spec.org muestra su uso: -XX: -UseStringCache. Tendré que volver a ejecutar los puntos de referencia para ver si hace una diferencia (una aplicación pesada de XML).

1

Tampoco he podido encontrar una JVM que respete esta configuración; como se comentó, la calidad y la utilidad de la documentación en torno a los parámetros de JVM es terrible y, sin embargo, por algún motivo parece ser un área donde los proveedores de JVM tienen margen para la diferenciación competitiva, aunque para ser justos, Oracle/Sun es la peor.

De todos modos si encuentra que su aplicación en un área particular usa una pequeña cantidad de valores de cadena repetidamente, entonces es definitivamente sensato usar el interning - utilizando el método String.intern() para devolver un valor interno. Tenga en cuenta que debe usar el valor de retorno, esto no es un efecto secundario en el valor original.

Al igual que con todos los ajustes de perfil/rendimiento, esto debe hacerse cuidadosamente con métricas y pruebas. Puede ser significativo (lo he sido para mí), pero si el grupo de valores no es pequeño, degrada el rendimiento y debe tener en cuenta que el conjunto de valores de cadena se mantiene en la Perm Gen y su uso afectará el uso de memoria, GC etc.

3

-XX: -UseStringCache funciona para mí, curiosamente.

mi versión JDK 1.6.0_22 debe ser

Cuestiones relacionadas