2010-02-11 19 views
5

Tengo un Tomcat con algunas aplicaciones ejecutándose. No puedo reiniciar Tomcat, pero me gustaría controlar el uso de los archivos de clase.¿Es posible iniciar sesión si se usa una clase en la JVM?

Me gustaría iniciar sesión si se utiliza una clase especificada. es posible? ¿Cómo podría lograrlo?

Uso Clase: Si un objeto de esta clase se instancia o métodos son llamados etc.

Aclaración: No puedo reiniciar la aplicación. Cada solución con recompilar el código de ejecución no es aceptable. Eso hace que el problema sea tan difícil.

Depuración remota/JMX no está habilitado todavía. Sería un esfuerzo similar, como recompilar la aplicación para activarla.

La plataforma es RHEL, 64 Bit.

+3

Por favor aclare lo que quiere decir con respecto a si una clase es "usada". –

+0

¿Puedes confirmar la plataforma? –

+1

¿Depuración remota, JMX o cualquier otra cosa ya configurada en la instancia de Tomcat? Si no, probablemente no tenga suerte ... – Nate

Respuesta

1

Me gustaría iniciar sesión si se utiliza una clase especificada; es decir, si se crea una instancia de un objeto para esta clase o se llaman métodos, etc.

Un perfilador de memoria le indicará si existe una instancia alcanzable de una clase en el instante en que ejecuta el generador de perfiles. Un perfilador de ejecución podría indicarle que se llama a un método o constructor durante algún intervalo ... aunque también puede perder una llamada, debido a la forma en que funcionan los perfiladores.

El cargador de clases de la webapp en teoría podría indicarle si se ha cargado una clase, pero dudo que haya una forma de llamar al método del cargador de clases que no implique un reinicio. Además, no hay forma de saber si se ha llamado ALGUNA VEZ un método o si alguna vez se ha creado una instancia aparte de agregar enlaces de supervisión a la clase. Y agregar esos ganchos implicaría un reinicio.

Y, por supuesto, hay otras formas en que una clase puede ser "utilizada" que no implique construir instancias o llamar a sus métodos.

Por lo tanto, dependiendo de lo que realmente está tratando de descubrir, puede que no tenga suerte.

1

Creo que necesita un perfil para eso. Profiler le permitirá ver qué clases se utilizan. O los programadores favoritos - System.out.println :)

+0

Voy a intentar crear perfiles, pero no estoy seguro de si funciona. – guerda

+1

Creo que la creación de perfiles requiere configuraciones en la JVM que requieren un reinicio para aplicar. –

0

Si tiene acceso a los archivos fuente, puede simplemente poner algunas instrucciones de registro en el constructor de la clase (suponiendo que la instanciación implica el uso de la clase).

Si la instanciación de objetos no es lo que quiere decir con "el uso de archivos de clase", ¿entonces quiere decir que le gustaría saber cuándo una clase es cargada por la JVM? Si es así, static initialization blocks puede ayudar; podrías poner las declaraciones de registro allí.

+1

si no puede reiniciar Tomcat, probablemente tampoco pueda actualizar el código de la aplicación. – Thilo

+0

No parece tan seguro. Me parece recordar haber incluido .jar en su directorio Tomcat para una implementación dinámica. –

+0

Parece inseguro, porque el OP no está claro en sus requisitos. Si reiniciar Tomcat está desactivado, es probable que también esté prohibido el redistribución en caliente (como quizás actualizar la fuente en primer lugar). – Thilo

0

Si quieres saberlo programáticamente, entonces no creo que sea trivialmente posible.

Pero puede hacer un poco de reflexión para conocerlo, llamando a este método.

ClassLoader#findLoadedClass() 

Si el método devuelve nulo, significa que la clase no está cargada y, por lo tanto, no está en uso. El problema, por supuesto, es que el método está protegido, por lo que debe usar el reflejo.

-1

puede definir un bloque estático de la clase

class X { 
static { 
    System.out.println("class X has been loaded"); 
} 
... 
} 

que se llama una vez cuando se carga el objeto de clase.

Si no puede editar el código, y usted tiene un JRE 6, puede probar con la herramienta jmap

jmap -histo <pid> 

se imprimirá un histograma de su montón, incluyendo todas las clases cargadas.

Usando jps se puede encontrar el PID

+0

Buena idea. Para mi problema, no funcionará porque no puedo recompilar la aplicación. – guerda

0

Si están en Solaris u OS X, a continuación, un sondeo de DTrace podría en opción.

Aparte de eso, si no puede adjuntar un depurador o generador de perfiles u otra herramienta de supervisión a la JVM en ejecución (que depende de las opciones que habría necesitado especificar al inicio), no tiene suerte.

+0

Solaris también tiene 'pfiles' o' truss' también. –

-1

Con el JRockit JVM puede iniciar su aplicación con -Xverbose: class = info para obtener información sobre la carga de clases.

+0

Sun's JVM también es compatible con esa marca. – Thilo

Cuestiones relacionadas