[英]Why Java process hang?
我的Java服務器中有許多線程。 當一個線程遞歸無限地調用方法時,它會掛起。 該方法被調用54次后,進程掛起,並且沒有任何日志,如“StackOverFlow”或“OutOfMemory”。
但是,據我所知,只有有問題的線程會崩潰,其他線程可以正常工作。
環境:
Linux版本2.6.31-20-server(buildd @ crested)(gcc版本4.4.1(Ubuntu 4.4.1-4ubuntu8))java版“1.6.0_18”Java(TM)SE運行時環境(版本1.6.0_18-b07) )Java HotSpot(TM)64位服務器VM(內置16.0-b13,混合模式)
所有線程都需要堆棧空間。 每次以遞歸方式調用方法時,堆棧都會擴展 - 最終你會耗盡。
您管理的迭代次數取決於正在運行的確切代碼。
生成一個線程轉儲,它將顯示VM中每個Java線程的堆棧跟蹤。 這將告訴您JVM掛起時線程正在做什么。
要在UNIX平台上生成線程轉儲,可以使用命令kill -QUIT process_id
,其中process_id是Java程序的進程ID。
在Windows上,您可以在啟動Java程序的窗口中輸入鍵序列<ctrl><break>
。 發送此信號指示JVM中的信號處理程序,以遞歸方式打印出JVM內的線程和監視器上的所有信息。
你已經回答了你的問題:
當一個線程遞歸無限地調用方法時,它會掛起。
我的建議是不要無限地調用一個方法,當你遞歸調用一個方法時,你會很快擴展你的堆棧。
你想用線程做什么? 您可以優化代碼以在沒有無限循環的情況下調用方法嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.