java 在程序结束时挂起
java hang at the end of program
我有一个 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");
}
程序打印 "end of test" 并挂起。什么可能导致这个问题?我没有使用任何框架。
我在 linux 机器上编译并 运行 这个。打印 "end of test" 后,linux 提示符“>”没有出现
从ps命令,我看到进程是运行ning.
我发现了问题。会话连接不会断开连接。但为什么它会阻塞出口?
如果我错了,请纠正我。主线程中没有加入或等待。主线程会被阻塞吗?
回答:
在 Stephen C 的帮助下,
最后,我找到了原因。在 C++ 中,所有线程在主线程退出后终止,但在 java 中,JVM 等待所有非守护线程完成。我将我的 c++ 知识应用到 Java 但在这种情况下它们是不同的。
一种可能是您创建了另一个线程,并且该线程尚未终止。在所有(非守护进程)线程终止之前,JVM 不会自行关闭。
另一种可能是你实现了关闭钩子,钩子被阻塞了。
From ps command, I see the process is running and single thread.
我认为该证据与上述任何一项都一致。
Can we troubleshoot from outside (such as ps command) instead of source code.
尝试使用 jstack
(我认为它被调用)来获取线程堆栈转储。
尝试将调试器附加到 JVM。
您需要明确调用 session.disconnect();
,而且如果您使用频道,那么您也需要打折频道。
我有一个 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");
}
程序打印 "end of test" 并挂起。什么可能导致这个问题?我没有使用任何框架。 我在 linux 机器上编译并 运行 这个。打印 "end of test" 后,linux 提示符“>”没有出现
从ps命令,我看到进程是运行ning.
我发现了问题。会话连接不会断开连接。但为什么它会阻塞出口? 如果我错了,请纠正我。主线程中没有加入或等待。主线程会被阻塞吗?
回答: 在 Stephen C 的帮助下, 最后,我找到了原因。在 C++ 中,所有线程在主线程退出后终止,但在 java 中,JVM 等待所有非守护线程完成。我将我的 c++ 知识应用到 Java 但在这种情况下它们是不同的。
一种可能是您创建了另一个线程,并且该线程尚未终止。在所有(非守护进程)线程终止之前,JVM 不会自行关闭。
另一种可能是你实现了关闭钩子,钩子被阻塞了。
From ps command, I see the process is running and single thread.
我认为该证据与上述任何一项都一致。
Can we troubleshoot from outside (such as ps command) instead of source code.
尝试使用 jstack
(我认为它被调用)来获取线程堆栈转储。
尝试将调试器附加到 JVM。
您需要明确调用 session.disconnect();
,而且如果您使用频道,那么您也需要打折频道。