簡體   English   中英

為什么Java進程掛起?

[英]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內的線程和監視器上的所有信息。

請求線程轉儲以查看您的線程執行的操作。 為您分叉的每個線程設置名稱以正確識別它們。 我想在對象監視器上也可能存在死鎖 我建議使用JProfiler來查找阻塞線程的對象。

另一方面,無限遞歸並不太好。 避免這種情況,或者為它定義限制。

你已經回答了你的問題:

當一個線程遞歸無限地調用方法時,它會掛起。

我的建議是不要無限地調用一個方法,當你遞歸調用一個方法時,你會很快擴展你的堆棧。

你想用線程做什么? 您可以優化代碼以在沒有無限循環的情況下調用方法嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM