¿Hay alguna forma de garantizar que todo el proceso Java se cerrará si se produce un bloqueo de la zona activa?Cómo forzar el proceso de Java para que salga de la falla de la zona activa
Estamos alojando una biblioteca nativa en un proceso remoto de Windows Java (java.exe), a los fines del aislamiento del proceso. Sin embargo, hemos descubierto que incluso cuando hay un bloqueo de punto de acceso, aunque el hilo principal "muere" con un bloqueo de punto de acceso, el proceso en sí no muere. Tenemos que matarlo en el Administrador de tareas.
Creemos que esto se debe a que la propia biblioteca nativa crea sus propios hilos que mantienen vivo el proceso.
Queremos que todo el proceso de Java se muera si se produce un bloqueo de punto de acceso.
Nuestro trabajo actual consiste en tener otro hilo que lea la salida del proceso generado (tenemos que leer la salida de la consola de todos modos para evitar que el proceso se bloquee). Hemos modificado que también buscan explícitamente un accidente VM:
private static String HOTSPOT_CRASH = "# A fatal error has been detected by the Java Runtime Environment";
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
do {
line = reader.readLine();
if (line != null) {
logger.info(prefix + ": " + line);
}
if(line.contains(HOTSPOT_CRASH)) {
logger.error(String.format("FATAL Hotspot crash detected. Killing child process '%s'...", hostProcess));
hostProcess.destroy();
}
} while (line != null);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
pero esto es un truco: Si la JVM sabe lo suficiente para cerrar la sesión que ha habido un accidente, sería mucho mejor si se pudiera dijo que terminar el proceso actual también.
¿Hay alguna manera de hacerlo? Idealmente, sería una opción de línea de comando para la JVM.
Un proceso no se puede bloquear parcialmente. Es casi seguro que haya dos procesos allí. –
¡problema interesante! un choque es un bloqueo, por lo que no puede hacer mucho si sucede. Probablemente construiría un monitor de latido (el niño envía un mensaje de ping al padre, y el padre envía pong cada pocos minutos). en ausencia de un latido del corazón, salga. – aishwarya
@Ingo - desafortunadamente yo también lo pensé. Pero resulta que estamos teniendo un bloqueo de punto de acceso, pero el proceso aún se mantiene. Solo cuando lo matamos en el Administrador de tareas realmente desaparece. –