C'è un modo per garantire che l'intero processo Java venga chiuso in caso di arresto anomalo di Hotspot?Come forzare l'esecuzione del processo Java sull'arresto dell'hotspot
Stiamo ospitando una libreria nativa in un processo Java di Windows remoto (java.exe), ai fini dell'isolamento del processo. Tuttavia, abbiamo scoperto che anche quando c'è un crash di hotspot, sebbene il thread principale "muoia" con un arresto di hotspot, il processo stesso non muoia. Dobbiamo ucciderlo in Task Manager.
Pensiamo che ciò potrebbe essere dovuto al fatto che la libreria nativa stessa crea i propri thread che mantengono in vita il processo.
Vogliamo che l'intero processo Java muoia se si verifica un arresto anomalo dell'hotspot.
Il nostro attuale lavoro è di avere un altro thread che sta leggendo l'output del processo generato (dobbiamo comunque leggere l'output della console per impedire il blocco del processo). Abbiamo modificato per guardare anche in modo esplicito per un incidente 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();
}
}
Ma questo è un hack: Se la JVM sa abbastanza per uscire che c'è stato un incidente, sarebbe molto meglio se potesse essere detto di Termina anche il processo corrente.
C'è un modo per farlo? Idealmente sarebbe una opzione da riga di comando per JVM.
Un processo non può arrestarsi in modo parziale. Quasi sicuramente hai due processi lì. –
problema interessante! un arresto anomalo è un arresto anomalo, quindi non è possibile fare molto se ciò accade. probabilmente creerei un monitor heartbeat (il bambino invia un messaggio ping al genitore, e il genitore invia il pong ogni pochi minuti). in assenza di battito cardiaco, esci. – aishwarya
@Ingo - purtroppo l'ho pensato anch'io. Ma si scopre che stiamo subendo un arresto anomalo, ma il processo continua a bloccarsi. Solo una volta che lo uccidiamo in Task Manager lo fa davvero. –