System.exit(0) 无法退出JVM.有没有好的办法定位问题?
qianhd
2011-11-16
实验室有一台机器, 关闭程序后无法依然存在javaw.exe进程
就这一台有这个问题. 应该跟系统有关, 但是始终找不到原因. 程序大致的架构是先用javaw.exe启一个launcher, 带界面, 根据用户选择再通过Runtime.exec方法启动子程序, 子程序为java.exe, 然后launcher使用Process.waitFor等待子程序结束. 子程序结束后launcher记录一下信息后使用System.exit()退出. 从日志上看System.exit(0)前的log有输出,应该执行到了System.exit(0) Jconsole连到javaw.exe上也看不出任何问题. 谁在这方面有过类似经验? 系统是Xp 32bit, jvm版本1.6.0_22 我换过很多版本的jvm在这台电脑上都有问题. 但是在别的电脑上就复现不了. |
|
suigara
2011-11-16
System.exit方法之前有个安全检查。看下安全检查通过了没? 不过如果不通过会抛异常的,看你的描述是没有异常。。。。 退出最终调用了: static native void halt0(int status); 这个本地方法应该调用了系统的某个函数,查查是什么函数,是不是你的那台电脑的这个函数不好使??? 以上只是思路、仅供参考,我自己没遇到过。。。。 |
|
qianhd
2011-11-16
suigara 写道 System.exit方法之前有个安全检查。看下安全检查通过了没? 不过如果不通过会抛异常的,看你的描述是没有异常。。。。 退出最终调用了: static native void halt0(int status); 这个本地方法应该调用了系统的某个函数,查查是什么函数,是不是你的那台电脑的这个函数不好使??? 以上只是思路、仅供参考,我自己没遇到过。。。。 从日志上看没有任何异常. 明天再研究研究 |
|
RednaxelaFX
2011-11-16
那个…如果你在32位Windows XP上用Oracle JDK 7也能重现出这个问题的话,那试试用jstack -m来看看到底卡住的时候跑到哪里了。
JDK 7之前的版本在Windows上用不了jstack -m |
|
suigara
2011-11-17
刚才模拟了一下,下面的代码可以在exit后程序依然不退出(和你说的一样),但对所有的机器都不退出。。。。看看能不能给你点思路。。。
public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { while (true) { try { System.out.println("closing..."); Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); System.out.println("before exit"); System.exit(0); System.out.println("****************************"); } |
|
suigara
2011-11-17
suigara 写道 刚才模拟了一下,下面的代码可以在exit后程序依然不退出(和你说的一样),但对所有的机器都不退出。。。。看看能不能给你点思路。。。
public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { while (true) { try { System.out.println("closing..."); Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); System.out.println("before exit"); System.exit(0); System.out.println("****************************"); } 忘了说了,控制台输出: before exit closing... closing... closing... closing... closing... closing... closing... closing... closing... closing... closing... closing... closing... 。。。。 |
|
qianhd
2011-11-17
suigara 写道 suigara 写道 刚才模拟了一下,下面的代码可以在exit后程序依然不退出(和你说的一样),但对所有的机器都不退出。。。。看看能不能给你点思路。。。
public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { while (true) { try { System.out.println("closing..."); Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); System.out.println("before exit"); System.exit(0); System.out.println("****************************"); } 忘了说了,控制台输出: before exit closing... closing... closing... closing... closing... closing... closing... closing... closing... closing... closing... closing... closing... 。。。。 System.exit()的退出的标准是什么? 所有非守护线程都终止吗? 如果还存在守护线程 是不是就无法退出? |
|
cczakai
2011-11-18
跟守护线程没关系,应该是用户线程吧
|
|
yizhilong28
2011-11-21
suigara 写道 刚才模拟了一下,下面的代码可以在exit后程序依然不退出(和你说的一样),但对所有的机器都不退出。。。。看看能不能给你点思路。。。
public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { while (true) { try { System.out.println("closing..."); Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); System.out.println("before exit"); System.exit(0); System.out.println("****************************"); } 你的钩子函数是个死循环,怎么退出? |
|
suigara
2011-11-22
yizhilong28 写道 suigara 写道 刚才模拟了一下,下面的代码可以在exit后程序依然不退出(和你说的一样),但对所有的机器都不退出。。。。看看能不能给你点思路。。。
public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { while (true) { try { System.out.println("closing..."); Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }); System.out.println("before exit"); System.exit(0); System.out.println("****************************"); } 你的钩子函数是个死循环,怎么退出? 当然是死循环了,我的意思是LZ程序的某个线程是否也存在这种情况。 只是给LZ一个思路罢了 |