Pregunta

Hace poco estuve leyendo sobre todos los argumentos de JVM disponibles en JRE 6 [ Java VM Opciones ] y vi esto:

  

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

Ahora siempre tuve la impresión de que Java mantenía un grupo de cadenas internas (¿palabra correcta?) y cuando hacía algo como la concatenación de cadenas con literales no creaba nuevos objetos, sino que los sacaba de este grupo. ¿Alguien ha usado este argumento o puede explicar por qué sería necesario?

EDITAR: intenté ejecutar un punto de referencia para ver si este argumento tenía algún efecto y no pude 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.

¿Fue útil?

Solución 6

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

Otros consejos

Creo que cuando se usa con -XX:+AggressiveOpts permite que se devuelvan los mismos String objetos al crear new String con el mismo texto (aunque no a través de <=>, por supuesto). Hay una fase de perfil donde se acumula un caché, y después de un punto, el caché se cambia a solo lectura. Obtiene puntajes más altos en ciertos puntos de referencia.

-XX: -UseStringCache funciona para mí, extrañamente.

mi versión jdk debería ser 1.6.0_22

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

Tampoco he podido encontrar una JVM que respete esta configuración; Como se comentó, la calidad y, por lo tanto, la utilidad de la documentación sobre los parámetros de JVM es terrible, y sin embargo, por alguna razón, parece ser un área donde los proveedores de JVM ven espacio para la diferenciación competitiva, aunque para ser justos, Oracle / Sun es, con mucho, el peor.

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

Como con todos los ajustes de perfil / rendimiento, esto debe hacerse con cuidado con las métricas y las pruebas. Puede ser significativo (lo ha sido para mí), pero si el conjunto de valores no es pequeño, degrada el rendimiento y debe tener en cuenta que el conjunto de valores de String se mantiene en Perm Gen y, por lo tanto, su uso afectará el uso de memoria, GC etc.

A partir de JDK 8.0, esta opción se ha eliminado. No me queda claro qué, en todo caso, se puede usar como reemplazo.

http://docs.oracle.com/ javase / 8 / docs / technotes / tools / unix / java.html

 -XX:+UseStringCache

    Enables caching of commonly allocated strings. This option was removed from JDK 8 
    with no replacement.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top