JRE更新后我遇到了问题。
如果我有一个已启动的Java应用程序并启动系统重启 - Windows无法自动停止此Java应用程序,我收到以下消息: “此程序阻止Windows重新启动”。 如果我按下取消,那么我可以看到阻止重启的Java应用程序挂起。 此问题会影响我的Java应用程序和jconsole等应用程序。
在JRE更新之前,一切正常 JRE 1.6.0_26 。 我首先在 JRE 1.6.0_36 上遇到了这个问题。但它也发生在1.6.0_39。
P.S:我有Windows Server 2008 R2 Interprise
有没有人遇到同样的问题,或者可以建议在这种情况下做什么? 感谢。
更新 我已经实现了以下addhook:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
logger.log("SHUTDOWN - BEGIN");
((Window) view).setVisible(false);
logger.log("SHUTDOWN - Visible");
((Window) view).dispose();
logger.log("SHUTDOWN - Dispose");
System.exit(0);
}
});
在具有这样的addhook的应用程序正常关闭系统重启之后,但我发现如果我们只关闭应用程序(通过按exit或“x”)Java VM未终止(我们可以在taskmgr中看到javaw进程)。
从日志文件中我可以看到该程序永远不会离开dispose()函数。如果我评论dispose()并且只留下System.exit(0)Java VM仍然无法终止。
更新2: 已为此问题创建了故障单。我们收到了 Oracle的回复:“问题已转载并确认。”
答案 0 :(得分:5)
matts,对于所有Java应用程序都会发生这种情况,它已经在仅使用2008 OS和JRE 6U37的服务器上进行了测试。如果我们启动Java控制面板然后尝试重新启动服务器,我们会收到Windows消息。
如果应用程序已最小化,我们无法收到消息。
消息“此程序阻止Windows重新启动”
如果你选择取消选项,Java控制面板挂起并且javaw.exe进程以25%cpu运行,我们可以选择“强制重启”或“取消”,这是在四处理器服务器上,所以我假设在单个处理器上,这将以100%cpu运行。
奥利弗
答案 1 :(得分:1)
我能想到一些事情:
1)你是否实现了shutdownhook(),可能在从OS获得QUIT信号时尝试做某事?
2)当你的应用程序挂起并检查里面发生的事情时,做一个线程转储(ctrl + break for windows-pls google?)。你应该得到一些线索。
3)在Java应用程序中仍然处于活动状态的非守护程序线程(如果有)可能会阻止JVM退出。
答案 2 :(得分:0)
此问题由Oracle修复。修复将包含在即将发布的JRE版本(1.6.0_42?)中。
作为您的应用程序的解决方法,您可以使用addhook。像这样的东西:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
((Window) view).setVisible(false);
Runtime.halt(0);
}
});
您应该使用 Runtime.halt(0)而不是System.exit(0),因为Java Machine拒绝在当前版本的JRE中的System.exit(0)之后停止。