有没有一种方法确保整个Java进程在Hotspot崩溃时会退出?
我们正在远程的Windows Java进程(java.exe)中托管本地库,以实现进程隔离。但是,我们发现即使有Hotspot崩溃,尽管主线程因热点崩溃而“死亡”,但进程本身并不死亡。我们必须在任务管理器中结束它。
我们认为这可能是因为本地库本身创建了它自己的线程,这些线程使进程保持活动状态。
如果发生热点崩溃,我们希望整个Java进程都能够终止。
我们目前的解决方法是有另一个线程读取生成进程的输出(我们必须读取控制台输出以防止进程阻塞)。我们修改了它来明确查找VM崩溃:
我们正在远程的Windows Java进程(java.exe)中托管本地库,以实现进程隔离。但是,我们发现即使有Hotspot崩溃,尽管主线程因热点崩溃而“死亡”,但进程本身并不死亡。我们必须在任务管理器中结束它。
我们认为这可能是因为本地库本身创建了它自己的线程,这些线程使进程保持活动状态。
如果发生热点崩溃,我们希望整个Java进程都能够终止。
我们目前的解决方法是有另一个线程读取生成进程的输出(我们必须读取控制台输出以防止进程阻塞)。我们修改了它来明确查找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();
}
}
但这只是一个hack:如果JVM足够智能,可以记录下崩溃的信息,那么更好的方法是让它终止当前进程。
有什么方法可以做到这一点吗?理想情况下,这应该是JVM的命令行选项。