|
|
1
6
当我使用stdout/stderr时,我的程序没有从task mgr中消失。在我的例子中,如果我在调用system.exit()之前关闭了正在侦听的流,那么javaw.exe就会挂起。奇怪的是,它不是在给小溪写信… 在我的例子中,解决方案是简单地刷新流,而不是在存在之前关闭它。当然,您可以在退出之前刷新并重定向回stdout和stderr。 |
|
|
2
7
如果您的代码(或您使用的库)有一个关闭挂钩或终结器没有完全完成,则可能会发生这种情况。 更有力的(所以只能在极端情况下使用!)强制关机的方法是运行:
|
|
|
3
4
这里有几个场景… 根据线程的定义 http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html … 当Java虚拟机启动时,通常会有一个非守护进程线程(通常调用名为某个指定类的main方法)。Java虚拟机继续执行线程,直到下列任何一个发生: 1)调用了类运行时的exit方法,安全管理器允许执行exit操作。 2)所有不是守护进程线程的线程都已死亡,方法是从对run方法的调用返回,或者抛出传播到run方法之外的异常。 另一种可能是调用了runfinalizersonexit方法。根据中的文件 http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html 不赞成的这种方法本质上是不安全的。它可能会导致在其他线程同时操作这些对象时对活动对象调用终结器,从而导致不稳定的行为或死锁。 在Exchange中启用或禁用终结;这样做指定所有尚未被自动调用的终结器的终结器将在Java运行时退出之前运行。默认情况下,将禁用退出时的终结。 如果存在安全管理器,则首先调用其checkExit方法,并使用0作为其参数,以确保允许退出。这可能会导致SecurityException。 |
|
|
4
1
也许是一个写得不好的定稿人?当我读到主题行时,第一个想到的是关闭钩子。推测:捕获InterruptedException并继续运行的线程是否会阻止退出进程? 在我看来,如果问题是可重复的,那么您应该能够附加到jvm并获得显示挂起内容的线程列表/堆栈跟踪。 你确定这孩子还真的在跑,而且这不仅仅是一个未读的僵尸进程吗? |
|
|
5
1
父进程是否使用来自子进程的错误和输出流? 如果在某些操作系统下,子进程在stdout/stderr上打印出一些错误/警告,并且父进程不使用流,则子进程将阻塞并且无法到达system.exit(); |
|
|
6
1
我也遇到了同样的问题,但对我来说,原因是我在使用远程调试(vmargs:-xdebug-xrunjdwp:transport=dt_socket,address=%port%,server=y,suspend=y),当我禁用此功能时,java.exe进程按预期退出。 |
|
|
7
0
我认为所有明显的原因都被暂时覆盖了,例如终结器、关闭挂钩、没有正确地排出父进程中的标准输出/标准错误。你现在需要更多的证据来确定到底发生了什么。 建议:
|
|
8
0
这里没有提到的另一个情况是,如果关闭钩子挂在某个东西上,那么在编写关闭钩子代码时要小心(如果第三方库也注册了挂起的关闭钩子)。 院长 |
|
|
thebiggestlebowski · bash函数非零退出代码 8 年前 |
|
|
Ahmad Fraz · 如果函数退出,如何继续“For循环” 8 年前 |
|
|
Nepo · Batch的ERRORLEVEL工作不正常且奇怪 8 年前 |
|
|
Arafat Hasan · 如何直接从构造函数结束C++代码? 8 年前 |
|
|
lloydyu24 · 无法关闭Python PyQt4上的对话框 9 年前 |