2010-01-25 25 views
12

Tengo un proceso java que se ejecuta actualmente bajo un shell de Windows.ejecutar nuevo código java en el proceso jvm existente

Uno de los subprocesos responsables de la serialización está bloqueado indefinidamente y, como resultado, la información importante que se almacena en la memoria ya no se escribe en el disco.

Si cierro el proceso, la información se perderá.

Sería conveniente si pudiera escribir y compilar un nuevo código y hacer que se ejecute en el mismo espacio de memoria para que dicha información pueda ser serializada una vez más antes de que cierre el proceso.

El proceso se inició utilizando un comando java -jar.

Con las características de punto de acceso VM, ¿hay alguna manera de lograr esto?

+0

¿Se puede conectar un depurador al proceso? Si es así, entonces puede activar el código para guardar los datos. – jdigital

+0

He usado btrace en el pasado en una situación algo similar. http://kenai.com/projects/btrace/pages/Home –

+0

Debería decir qué versión de la JVM está usando. –

Respuesta

12

Puede usar el Attach API para conectarlo a una máquina virtual. Here's an article that explains how to use it

Aquí está un ejemplo de código:

String agentJAR = "myAgent.jar"; 
VirtualMachine vm = VirtualMachine.attach (processid); 
vm.loadAgent(agentJAR); 

Cuando el agente es el nombre de su frasco.

El contenedor de agentes contiene un Agent, que puede interactuar con la JVM utilizando la API de instrumentación.

Para crear un agente que se carga en tiempo de ejecución, se implementa una función agentmain así:

public static void agentmain(String agentArgs, Instrumentation inst); 

o

public static void agentmain(String agentArgs); 

El objeto Instrumentation se utiliza para modificar las clases en tiempo de ejecución, que se probablemente no lo necesite Pero con suerte puedes simplemente poner el código que necesites para ejecutar en agentmain y luego usar la API adjunta para ejecutarlo en la JVM objetivo.

¡Buena suerte!

+0

gracias, esa es probablemente la mejor opción, sin embargo, dudo que pueda hacer lo que quiero, que alguien controle un campo de objetos (que no tiene referencia estática) y lo serialice. ¡haré mi mejor esfuerzo (peor) sin embargo! – pstanton

+0

en realidad, yo * podría * resolver mi problema arrojando una excepción en un hilo en particular.este hilo está actualmente colgado en un zócalo indefinidamente. Sé cómo manejar el hilo y tendré que lanzar una excepción, o puedo terminarlo y reiniciarlo. intentará. Gracias. – pstanton

+0

Puedes intentar interrumpirlo. –

Cuestiones relacionadas