我正在Red Hat Linux上调查Java问题(使用IBM JVM 1.4.2 64位)。 我想知道是否有人以前看过这个错误信息,并知道是否有解决这个问题的方法?Java错误:java.lang.IllegalArgumentException:VM已使用的信号:INT
来源:
import sun.misc.Signal;
import sun.misc.SignalHandler;
public class SignalTest extends Thread
{
private static Signal signal = new Signal("INT");
private static ShutdownHandler handler = new ShutdownHandler();
private static class ShutdownHandler implements SignalHandler
{
public void handle(Signal sig)
{
}
}
public static void main(String[] args)
{
try
{
Signal.handle(signal, handler);
}
catch(Throwable e)
{
e.printStackTrace();
}
try { Thread.sleep(5000); } catch(Exception e) { e.printStackTrace(); }
System.exit(0);
}
}
输出:
java.lang.IllegalArgumentException <Signal already used by VM: INT>
java.lang.IllegalArgumentException: Signal already used by VM: INT
at
com.ibm.misc.SignalDispatcher.registerSignal(SignalDispatcher.java:145)
at sun.misc.Signal.handle(Signal.java:199)
at xxx
附加信息:
我发现了一些奇怪的事情。 它失败的原因是因为我在shell脚本中运行程序作为后台进程。
即 sigtest.sh:
#!/bin/bash
java -cp . SignalTest >> sigtest.log 2>&1 &
如果我在命令行中运行该程序,或者删除“&”(即使它的shell脚本里面前台进程),这不有问题... 我不明白为什么会出现这种情况。
Jin,考虑到您对我的回答的评论,JVM不会让您在此事件中注册钩子。你能更详细地描述你想要完成的事情吗?也许有一种方法可以更好地与JVM的期望保持同步。 – Yishai 2009-06-29 20:53:43
我想通过运行一些“清理”的代码,如果程序中断,可以优雅地退出程序。 – 2009-06-29 21:03:03
问题是JVM特有的。 我将赏金授予Jitter,因为他的回答包括“特定于JVM实现”,并提供了诊断我的问题的最多工具。 谢谢大家。 – 2009-07-06 15:39:14