我的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,混合模式)
答案 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)
你已经回答了你的问题:
当一个线程递归时它会挂起 无限地调用方法。
我的建议是不要无限地调用方法,当你递归调用方法时,你会很快扩展堆栈。
你想用线程做什么?您是否可以优化代码以在没有无限循环的情况下调用方法?