java在程序结束时挂起



我有一个java程序,它打印出主程序的最后一条语句并挂起。我想知道是什么原因导致了这个问题,谢谢。

 public static void main(String[] args) {
        ...
        ...
        JSch jsch=new JSch();
    try {
        jsch.addIdentity("xxx");
        session = jsch.getSession("centos", this.ip, 22);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();
    } catch (JSchException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    ...
    ...
        System.out.println("end of test");
    }

程序打印"测试结束"并挂起。是什么原因导致了这个问题?我没有使用任何框架。我在linux机器上编译并运行了这个。打印"测试结束"后,linux提示">"不会显示

从ps命令,我看到进程正在运行。

我发现了问题。会话连接不会受到干扰。但为什么它会堵住出口?如果我错了,请纠正我。主线程内部不存在联接或等待。主线程会被阻塞吗?

答案:在Stephen C的帮助下,终于,我找到了原因。在c++中,所有线程都在主线程退出后终止,但在java中,JVM等待所有非守护进程线程完成。我将我的c++知识应用于Java,但在这种情况下它们有所不同。

一种可能是您创建了另一个线程,但该线程尚未终止。JVM不会自动关闭,直到所有(非守护进程)线程都终止。

另一种可能性是,您已经实现了一个关机挂钩,而挂钩已经阻塞。

从ps命令中,我看到进程正在运行并且是单线程的。

我认为,这一证据与上述任何一项都是一致的。


我们可以从外部(如ps命令)而不是源代码进行故障排除吗。

尝试使用jstack(我认为它被调用了)来获取线程堆栈转储。

尝试将调试器附加到JVM。

您需要显式调用session.disconnect();,如果您使用通道,则也需要对通道进行折扣。

相关内容

  • 没有找到相关文章