2012-01-09 19 views
6

Mi aplicación usa mucha más memoria de la que creo que debería usar, y estoy tratando de entender qué clase está usando una gran cantidad de la memoria y tal vez no lo libere.Muestra de memoria Java VisualVM - cómo obtener el tamaño de una clase específica

Estoy usando VisualVM y en la muestra de memoria puedo ver que la mayor parte de la memoria se usa en Chars, Strings y Bytes, todas mis clases usan Strings, pero como usted sabe, VisualVM muestra TODO Chars y Strings en el sistema (todas las Caracteres son idénticas a las Cadenas, lo que hace difícil entender quién las tiene), ya que entiendo que el tamaño de las otras clases que contienen estas cadenas se calcula sin las cadenas.

¿Cómo puedo ver en esta herramienta cuáles son las clases más grandes "reales", las que tienen todas estas cadenas? (preferiblemente si puedo obtener de estas clases a sus cadenas y no al revés) Traté de usar la "raíz para el GC más cercano" en la pila de heap, pero hay alrededor de 4.000.000 cadenas, por lo que la posibilidad de encontrar la "problemática" "unos es muy pequeño ...

Gracias !!!

+0

Creo que no se puede decir explícitamente qué clase usa la cantidad de memoria. Si estás instanciando el objeto de otra clase en alguna clase diferente, ¿cómo lo harías? También que yo sepa, no se puede obtener una utilización de memografía basada en la clase. – Johnydep

Respuesta

2

Si realiza un volcado de pila, puede encontrar los 20 objetos más grandes (incluido todo el espacio al que hace referencia). Para algo más, recomiendo usar la consola OQL que es muy poderosa.

Básicamente, usted está buscando el siguiente:

Lot of String's taking up 20Mb 
    --- kept alive by ---> 
HashSet#28839 
    --- kept alive by ---> 
MyOwnClass#88293 

propongo se toma una cadena aleatoria, parece que es referrees y analizar esto hasta que se entera de un posible sospechoso. Una vez que tenga este sospechoso, puede hacer una consulta OQL usando http://visualvm.java.net/oqlhelp.html#rsizeof para conocer el tamaño total de estos objetos.

+0

Gracias! Voy a intentar esto ahora, espero encontrar algo usando este método. – aye

+0

Hola, ¿sabes cómo puedo encontrar una gran instancia específica? Solo veo las 4,000,000 cadenas que son las más grandes, pero no puedo ver las instancias específicas que son las más grandes. – aye

+0

Tiene su volcado de pila en el que la vista de clases especifica que String tiene la mayor cantidad de bytes [%]. Haga doble clic en esto, que lo lleva a la vista Instancias. Aquí, puede seleccionar una instancia específica y seguir las referencias en el panel inferior. – parasietje

2

Realice un vuelco del montón, ábralo con MAT y busque en el histograma los tamaños retenidos más grandes.

+0

Gracias por su ayuda :) – aye

+0

Puede hacer lo mismo con VisualVM. –

Cuestiones relacionadas