为什么Java进程挂起?

时间:2010-11-30 11:34:38

标签: java stack-overflow

我的Java服务器中有许多线程。 当一个线程递归无限地调用方法时,它会挂起。 该方法被调用54次后,进程挂起,并且没有任何日志,如“StackOverFlow”或“OutOfMemory”。

但是,据我所知,只有遇到问题的线程会崩溃,其他线程可以正常工作。

环境:

  

Linux版本2.6.31-20-服务器   (buildd @ crested)(gcc版本4.4.1   (Ubuntu 4.4.1-4ubuntu8))java版   “1.6.0_18”Java(TM)SE运行时   环境(build 1.6.0_18-b07)Java   HotSpot(TM)64位服务器VM(构建   16.0-b13,混合模式)

4 个答案:

答案 0 :(得分:2)

所有线程都需要堆栈空间。每次以递归方式调用方法时,堆栈都会扩展 - 最终你会用完。

您管理的迭代次数取决于正在运行的确切代码。

答案 1 :(得分:1)

生成一个线程转储,它将显示VM中每个Java线程的堆栈跟踪。这将告诉您JVM挂起时线程正在做什么。

要在UNIX平台上生成线程转储,可以使用命令kill -QUIT process_id,其中process_id是Java程序的进程ID。

在Windows上,您可以在启动Java程序的窗口中输入密钥序列<ctrl><break>。发送此信号指示JVM中的信号处理程序,以递归方式打印出JVM内线程和监视器上的所有信息。

答案 2 :(得分:1)

请求线程转储以查看您的线程执行的操作。为您分叉的每个线程设置名称以正确识别它们。我想在对象监视器上也可能有一个dead lock。我建议使用JProfiler查找threads are blocked on

对象

另一方面,无限递归并不太好。避免这种情况,或为其定义限制。

答案 3 :(得分:0)

你已经回答了你的问题:

  

当一个线程递归时它会挂起   无限地调用方法。

我的建议是不要无限地调用方法,当你递归调用方法时,你会很快扩展堆栈。

你想用线程做什么?您是否可以优化代码以在没有无限循环的情况下调用方法?