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一个思路罢了
Global site tag (gtag.js) - Google Analytics