2010-05-11 11 views
7

En el trabajo, encontramos que en algunas instancias (especialmente las lentas) tenemos un comportamiento diferente, adquirido en el reinicio.¿Podemos ver objetos en la memoria JVM?

Suponemos que un caché no se inicializó correctamente, o tal vez un problema de simultaneidad ... De todos modos no es reproducible en ningún otro medio que no sea la producción.

En realidad no tenemos madereros para activar ... es un componente de edad ...

Por lo tanto me gustaría saber si hay herramientas que nos pueden ayudar a ver los diferentes objetos presentes en la memoria JVM para verificar el contenido de la caché ...

¡Gracias!

Editar:

no tengo acceso a los servidores de producción directa, nuestro servidor de aplicaciones WebLogic es 10, no tengo un puntero al objeto pero sé que el tipo de objeto caché .. .

Edit2:

Nuestros servidores están ejecutando en JRE 1.5, es posible utilizar jmap? No lo puede encontrar en un JDK5 :( Además, la depuración remota podría ser agradable, pero no podemos por razones de seguridad ...

Edit3:

En realidad jhat + VisualVM está bien para mí, Encontré mi objeto en el volcado, pero no puedo leer el hashmap (objeto que contiene aproximadamente 60000 elementos) correctamente ... ¿Hay alguna herramienta para leer un mapa concurrente de manera amistosa? Necesito encontrar el valor de una clave (o su existencia en el mapa) sin examinar manualmente los registros 60k. En realidad, leí en eclipse foro MAT que tampoco es posible con él ...

Edit4: Después de algunas experiencias realmente me gustan las herramientas como VisualVM. También usé YourKit. Existen algunas funciones útiles como OQL para encontrar las instancias correctas que necesita ver ...

+0

No conozco una forma de acceder al objeto sin tener algún tipo de referencia de puntero/variable. – aperkins

Respuesta

6

Esto es básicamente para expandir lo que Will dijo. He tenido un gran éxito al hacer que nuestros administradores hagan un montón de nuestros sistemas de producción, aunque con la advertencia de que el servidor en particular al que está descargando no responderá hasta que finalice el volcado. Luego, obtenga ese archivo y use el plugin Eclipse MAT para verlo. Si no te gusta Eclipse, también puedes usar Netbeans y el plugin VisualVM. Sin embargo, esto puede crear algunos archivos grandes, es posible que deba ejecutar en un sistema de 64 bits.

+1

+1 para VisualVM – ykaganovich

+0

+1 para Eclipse MAT - es el visualizador de montón más potente (gratuito) que existe. Muy recomendado, y tiene increíbles plugins para ver el montón de maneras interesantes (por ejemplo, fill fill%). –

3

¿Tiene acceso a un control/puntero a los objetos? Si es así, puede iniciarlo en modo de depuración y verlo en un depurador como Eclipse. Esto le permitirá inspeccionar variables y similares.

Alternativamente, podría escribir un pequeño registrador que recorre reflexivamente la clase y registra lo que está sucediendo. Todo esto supone que tiene una ubicación en la que puede comenzar a ingresar al código o puede obtener una referencia a los valores en caché.


edición: Como señalé en mi comentario, no sé de una manera de obtener acceso a un objeto sin algún tipo de referencia o enlace de referencias. Por ejemplo, ¿el objeto está encapsulado en otro objeto?Si es así, se puede hacer algo como lo siguiente:

Class<?> objectClass = myPointer.getClass(); 
Field[] objectFields = objectClass.getDeclaredFields(); 
for (Field field : objectFields) { 
    field.setAccessible(true); 
    //Or whatever you would need to do to get the information you need 
    System.out.println(field.get(myPointer).toString()); 
} 

También puede hacer algo como:

Field targetField = objectClass.getDeclaredField("myFieldName"); 
targetField.setAccessible(true); 
MyOldObjectType target = (MyOldObjectType)targetField.get(myPointer); 
//do whatever you need to do here 

Tenga en cuenta que toda la reflexión métodos que generan excepciones, por lo que necesitará para manejar los ya apropiado. Además, setAccessible(true) significa que puede acceder a campos y métodos privados en el objeto. Esto es EXTREMADAMENTE PELIGROSO - Úselo únicamente si es absolutamente necesario.

+0

No creo que un depurador como ese presente en Eclipse sea una opción porque "no es reproducible en ningún otro entorno que no sea la producción". –

+1

@Andrew Hubbs: personalmente utilicé la depuración de Eclipse en un entorno de producción: debe iniciar el sistema en modo de depuración y configurarlo para la conexión remota. Hay opciones allí, no es fácil, pero es posible. – aperkins

+0

nuestros servidores no están en la misma ciudad, no sé si pueden iniciar un weblogic de producción en modo de depuración, y tampoco sé si me darían acceso a través de un túnel ... –

4

Es bastante fácil de ejecutar jmap para volcar una cuenta de instancias de objetos, pero no sé si eso es lo que realmente interesa.

También puede utilizar jmap hacer un volcado del montón de la todo el montón, y con eso (y jhat), puedes ver RELACIONES de objeto (es decir, qué objeto apunta a qué), pero no necesariamente OBJETIVOS del objeto.

Ciertamente, los datos están allí en el volcado del montón, no está "clic" visible.

Algunos de los perfiladores profesionales creo que le permitirán introspectar objetos en un volcado de pila.

De lo contrario, será mejor que agregue algunos instrumentos específicos a la aplicación para proporcionar la introspección específica que está buscando, activada por código personalizado, JMX o lo que sea.

+0

+1 - No sabía sobre el volcado del montón. Eso habría sido realmente útil hace un mes o dos para mí :) – aperkins

+0

Usamos java 1.5 ¿Es posible usar jmap en un jre 1.5? He encontrado jmap solo en jdk6 y no podría funcionar con mi jre local 1.5 ... –

Cuestiones relacionadas