2009-08-04 19 views
21

¿Cómo puedo saber quién creó un subproceso en Java?Detectar quién creó un subproceso (con Eclipse)

Imagine lo siguiente: Utiliza ~ 30 terceros JAR en un entorno de complemento complejo. Usted lo inicia, ejecuta mucho código, hace algunos cálculos y finalmente llama a shutdown().

Este ciclo de vida por lo general funciona bien, excepto que en cada ejecución algunos hilos (no-demoníacos) permanecen colgando. Esto no sería un problema si cada cierre fuera el último apagado, simplemente podría ejecutar System.exit() en ese caso. Sin embargo, este ciclo puede ejecutarse varias veces y produce cada vez más basura.

Entonces, ¿qué debo hacer? Veo los hilos en la vista de depuración de Eclipse. Veo sus rastros de pila, pero no contienen ninguna pista sobre su origen. No hay rastro de pila del creador, no hay nombre de clase distinguible, nada.

¿Alguien tiene una idea de cómo solucionar este problema?

+0

Creo que debería poder ver el código fuente en el campo acc heredado. –

+0

Relacionado con http://stackoverflow.com/questions/9874641/tracking-java-thread-creation-and-lifetime –

Respuesta

10

Nombre religiosamente mis hilos (usando Thread(Runnable, String), por ejemplo), de lo contrario terminan con un nombre genérico y algo inútil. Al volcar los hilos se resaltará lo que se está ejecutando y (por lo tanto) lo que los creó. Esto no resuelve la creación de hilos de terceros, te lo agradezco.

EDITAR: El boletín informativo de JavaSpecialist abordó este tema recientemente (febrero de 2015) mediante el uso de un administrador de seguridad. Ver here for more details

MÁS: Un par de detalles para el uso de la técnica de JavaSpecialist: La API de SecurityManager incluye "checkAccess (newThreadBeingCreated)" que se llama en el subproceso del hilo creador. El nuevo hilo ya tiene su "nombre" inicializado. Entonces, en ese método, usted tiene acceso tanto al hilo del creador del hilo, como al nuevo, y puede iniciar sesión/imprimir, etc. Cuando lo intenté, el código que estaba siendo monitoreado comenzó a arrojar excepciones de protección de acceso; Lo arreglé llamando bajo AccessController.doPriviledged (nueva PrivilegedAction() {...} donde el método run() llamó al código que se está monitoreando.

0

Desafortunadamente no. Dentro de Eclipse veo todo el bloqueo subprocesos, pero sus seguimientos de pila solo reflejan su estado interno y (aparentemente) no revelan información sobre la ubicación de su creación. Además, al mirar dentro del objeto (usando la vista Variables) no pude obtener más pistas.

+0

"desafortunadamente no es así", ¿qué es "eso" y qué no? –

+0

"resuelve la creación de hilos de terceros" – EoH

+0

@EoH, supongo que querías comentar pero enviaste una respuesta. Por favor, elimine su respuesta y haga un comentario. (No sé cómo esto no fue votado todavía)))) – superM

1

Al depurar su aplicación Eclipse, puede detener todo el hilo haciendo clic en el campo org.eclipse.equinox.launcher.Main en la vista de depuración

Luego, desde allí, para cada hilo, puede ver el seguimiento de la pila y sube al método de ejecución de thred.

A veces esto puede ayudar y otras no.

Como Brian dijo, es una buena práctica para nombrar las discusiones porque es la única manera de identificar fácilmente "que los creó"

+1

Como ya dije, hice esto y no sirve de nada en este caso. Y repito: yo * no * creé estos hilos. – EoH

+0

Como dije, creo que el nombre es la única solución rápida para eso. Como el "creador" de estos hilos no lo llamó, creo que la solución que mencionaste (depuración de Thread.start()) es la única ... –

13

bien, yo era capaz de resolver (tipo de) el problema por mi cuenta: I poner un punto de interrupción en

Thread.start() 

y paso manualmente a través de cada invocación. De esta forma descubrí bastante rápido que Class.forName() lote inicializado de código estático que a cambio creaba estos misteriosos hilos.

Si bien pude resolver mi problema, todavía creo que la tarea más general aún no se ha abordado.

Cuestiones relacionadas