2010-01-08 17 views
10

Actualmente estoy teniendo el problema de que tengo un programa (parcial) que está intentando cargar una clase pero falla porque no puede encontrar esta clase. Mirando el rastro de la pila, no puedo ver ninguna razón particular para por qué la VM intenta cargar esta clase en particular en primer lugar. ¿Hay alguna herramienta que me permita averiguar por qué se carga una clase en particular?Java: averiguar * por qué * una clase está cargada

Sugerencia: Ya estoy obteniendo un seguimiento de la pila en el punto exacto donde la JVM intenta cargar la clase (a través de un agente). Sin embargo, el seguimiento de pila no contiene números de línea. Por lo tanto, solo sé qué método desencadena la clase que se está cargando, no qué enunciado. Entonces, incluso saber la declaración puede no ser suficiente. Una sola declaración puede hacer que una clase se cargue de muchas maneras, porque a veces la VM necesita cargar parte del cierre transitivo de las clases.

+1

No estoy familiarizado con Java, pero ¿qué le parece proporcionar un simulacro de esta clase y mirar la pila de llamadas? Si eso es posible en Java, de todos modos. – balpha

+3

Quizás podría publicar el Stack Trace aquí ya que alguien podría ayudarlo a usarlo. –

+0

Podría ser un efecto secundario del verificador (ver Puzzles de Java). Pero se necesita más información. –

Respuesta

19

Ejecute su programa con los indicadores -XX:+TraceClassLoading y -XX:+TraceClassResolution. Esto creará un montón de salida que se parece a la siguiente:

[Loaded com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader from file:/home/kgregory/Workspace/Website/programming/examples/bin/] 
RESOLVE com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader java.net.URLClassLoader 
RESOLVE java.net.URLClassLoader java.lang.Class URLClassLoader.java:188 

Tendrá que rastrear la cadena de mensajes de resolución por una clase particular. O más probablemente, verá un error cuando su programa intente cargar la clase, precedido por mensajes de resolución para la clase que lo carga).

+0

Eso parece útil. Lo comprobaré, ¡gracias! – user66237

+0

¡Resultó ser justo lo que necesitaba! ¡Hice mi día! ¡Muchas gracias! – user66237

+0

Exactamente lo que también es necesario. Pero tenga en cuenta a las personas no observadoras como yo: si selecciona ciegamente y copia los argumentos "-XX: + TraceClassLoading y -XX: + TraceClassResolution, asegúrese de no copiar el" y "entre ellos cuando utilice esto. No puedo creer cuánto tiempo me tomó descubrir el error del piloto. –

5

Puede probar una herramienta de análisis estático como JDepender para ver qué clases tienen referencias a esa clase.

+1

Ya lo hice, pero las dependencias son bastante sutiles. La clase que se carga no se menciona en el método que se está ejecutando actualmente cuando se carga la clase. Debe ser algo así como una súper clase de un tipo de campo de una súper clase de una clase receptora de algún tipo en el método actual ... entiendes lo que quiero decir. – user66237

0

cargadores de clases

Si se trata de un envorinment donde múltiples cargadores de clase están en el juego (como una aplicación web) que debe tener cuidado. Por favor, cuéntanos cuál es la aplicación.

recursos

decirnos dónde están los frascos (que archivo/estructura dir) y qué clase se está cargando. ¿Lo estás cargando dinámicamente usando Class.forName? o usando primavera u otro marco de IOC? ¿Es la clase principal?

Algunas pruebas anteriores (a ayudarnos)

Tal vez usted puede probar algunas cosas usando Class.getResource() desde dentro del método principal. Si su clase es foo.bar.Clazz intente Class.getResource ("/ foo/bar/Clazz.class") para ver si devuelve algo válido o no. Intenta hacer lo mismo con la clase que carga tu clase que falla para ver si es donde esperas.

+0

Ya estoy obteniendo un seguimiento de pila en el punto exacto donde la JVM intenta cargar la clase (a través de un agente). Sin embargo, el seguimiento de pila no contiene números de línea. Por lo tanto, solo sé qué método desencadena la clase que se está cargando, no qué enunciado. – user66237

+0

Mi intención era ver si la clase que provocaba la carga de clase problemática estaba en el cargador de clases esperado (digamos jar) u otro.Eso por supuesto, si tienes cargadores de varias clases ... :( – helios

Cuestiones relacionadas