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在程序结束时挂起的主要内容,如果未能解决你的问题,请参考以下文章
ResultSet.next() 在使用 jdbc 与 oracle 11.2 交谈时挂起