2011-05-30 7 views
19

Estoy buscando una herramienta de depuración que pueda enumerar las cadenas que se han internalizado? Idealmente, me gustaría poner una marca y tener una lista de las cadenas que se agregaron después de esa marca.¿Qué herramienta de depuración puede enumerar las cadenas internalizadas?

Gracias de antemano.

+0

¿Qué IDE usas? –

+0

@Ed Staub - Estoy usando eclipse en una computadora de ventana, pero estoy compilando con una hormiga en una computadora Linux y corriendo allí. ¿Porque lo preguntas? –

+0

No estoy seguro de si esto es útil: puede poner un formateador de detalles del depurador en String que se mostrará si está internado, por ejemplo: '(this == this.intern())? ("^"+ ToString()): toString () '. ¿Puedes explicar para qué necesitas la herramienta? ¿Es porque confía en la prueba de igualdad, o está buscando en el uso de la memoria, o ... –

Respuesta

1

En la máquina virtual Hotspot reciente, las cadenas internas se parecen a cualquier otra - la única diferencia es que la matriz virtual está siendo rastreada por la VM (pensé que tenía una referencia JNI adicional, pero no aparece en YourKit volcar - será interesante investigarlo).

Dicho esto, Yourkit proporciona una inspección de memoria para cadenas duplicadas, que creo que hace lo que necesita. Si lo combina con 'Trace Allocations', puede ir directamente al código que asignó estas cadenas.

Ver http://www.yourkit.com/docs/95/help/inspections_mem.jsp#duplicate_strings

-

lista de cadenas añadidas entre dos puntos en el tiempo rápido ha sido más fácil:

  1. Obtener dos de lixiviación en vertederos utilizando jmap o el perfilador favorito
  2. Do una diferencia de los montones
  3. Muestra todas las instancias de la clase String

Debe ser factible con cualquier generador de perfiles o incluso jhat (si es lo suficientemente paciente). Si usa YourKit, puede usar la función de marcador y tomar solo una instantánea de montón.

+1

El problema no es la cadena duplicada. Duplicados están en la memoria del montón, que tengo mucho. El problema es cadena interna. Tener una lista de todas las cadenas no ayudará si no puedo ver cuáles están internados y cuáles no. –

2

Quizás la forma más fácil es utilizar un visor de código de bytes. Cualquier cadena que esté internada estará presente en la constante_pool del archivo de clase en el que se incluye el literal String. Por ejemplo, en un archivo de clase reciente de otra pregunta de StackOverflow que respondí, tenía el siguiente literal String en mi código: "sun.awt.noerasebackground". Esto aparece en el grupo constante como un tipo 'String_info'. El visor de bytecode (y editor, ¡cuidado!) Que uso es el JBE. JBE Download

+0

¿Tiene una url de la documentación sobre JBE? –

+0

Es un proyecto pequeño, y no tiene documentación por lo que sé. – Josh

Cuestiones relacionadas