java在程序结束时挂起

Posted

技术标签:

【中文标题】java在程序结束时挂起【英文标题】:java hang at the end of program 【发布时间】:2015-11-25 22:17:01 【问题描述】:

我有一个 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 命令,我看到进程正在运行。

我发现了问题。会话连接不会断开连接。但为什么它会阻塞出口? 如果我错了,请纠正我。主线程内没有加入或等待。主线程会被阻塞吗?

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

【问题讨论】:

那些... 点可能隐藏了一些关键代码。请发布您的minimal reproducible example。 某事使您的程序挂起,而且不是打印语句,因此您需要提供有关您的代码的更多信息才能获得帮助。 "程序打印“测试结束”并挂起"你确定它挂起吗?也许它只是结束了?或者,也许您创建了一些额外的线程,但尚未结束阻止您的应用退出。 挂起是什么意思?您是从命令行命令提示符运行它吗?请改进问题。您是否尝试过剥离其余代码并运行您在此处显示的内容?简化版还挂着吗? 那么,你会向我们展示足够多的代码来让我们回答这个问题吗?还是要删除问题?这真的是一个或另一个。 【参考方案1】:

一种可能是您创建了另一个线程,而该线程尚未终止。在所有(非守护程序)线程终止之前,JVM 不会自行关闭。

另一种可能是你实现了一个关闭钩子,而这个钩子被阻塞了。

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

我认为该证据与上述任何一个都一致。


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

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

尝试将调试器附加到 JVM。

【讨论】:

ps -axfj。它显示在这个过程中没有孩子。我相信没有其他线程 “主”线程已经终止......所以你可以/将会看到另一个线程。请注意,关闭钩子也是一个线程。现在,如果您的程序是单线程的并且不使用关闭钩子,那么您可以忽略这些可能性……但它们 >> 23357 23378 23357 20112 分/1 23357 Sl+ 1000 0:02 | _ /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-2.b17.el7_1.x86_64/jre/bin/java -classpath /vagrant/aws-java-sdk-1.10.32/third- party/aspectj-1.6/aspectjrt.jar:... ... CreateSecurityGroupApp 你怎么知道这是“主”线程?所有的线程看起来都是这样的。 是的......有一个答案说,当“主”线程终止时,JVM 就会退出。不幸的是,这是不正确的。而且很容易证明它是不正确的。【参考方案2】:

您需要显式调用session.disconnect();,并且如果您使用渠道,那么您也需要折扣渠道。

【讨论】:

以上是关于java在程序结束时挂起的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient 在执行第二个请求时挂起

ResultSet.next() 在使用 jdbc 与 oracle 11.2 交谈时挂起

独立的 Windows 应用程序在焦点更改时挂起

Spring Boot Reactive Mongo 在启动时挂起

QEMU 在引导时挂起

创建线程会在终止时挂起 MFC 对话框应用程序