因此,我繼承了一些代碼,它們正在等待來自網絡源的通信。Java Thread.sleep泄漏線程?
當它正在等待來自網絡套接字的更多數據時,Thread.sleep(10)
被調用。這似乎是導致線程泄漏,如JConsole的報道,在這裏我的線程轉儲(也有數百個條目的主題-68,螺紋385,等...但我縮短了簡潔):
Wed Jan 18 09:14:40 PST 2012
2012-01-18 09:14:50
Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.0-b11 mixed mode):
"Thread-69" daemon prio=10 tid=0x00007f01a047c800 nid=0x3725 waiting on condition [0x00007f019eaf4000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.unitt.framework.websocket.simple.NetworkSocket.run(NetworkSocket.java:304)
at java.lang.Thread.run(Thread.java:662)
"Thread-68" daemon prio=10 tid=0x00007f01a0500000 nid=0x371c waiting on condition [0x00007f019ecf6000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.unitt.framework.websocket.simple.NetworkSocket.run(NetworkSocket.java:304)
at java.lang.Thread.run(Thread.java:662)
有問題的代碼:
public class NetworkSocket implements NetworkSocketFacade, Runnable
{
... removed many irrelevant methods
public void run()
{
byte[] readBuffer = new byte[512 * 1024];
while (isRunning)
{
//ioLogger.debug("in while(isRunning) loop");
try
{
int length = input.available();
if (length > 0)
{
int read = input.read(readBuffer, 0, readBuffer.length);
if (read < 0)
{
isRunning = false;
//@todo: do we disconnect?
ioLogger.debug("setting isRunning FALSE after read < 0");
}
else
{
//read data and process
}
}
else
{
//ioLogger.debug("nothing to read, sleeping");
try
{
Thread.sleep(10);
}
catch (InterruptedException e)
{
//do nothing, keep going
}
}
}
// some catch blocks and logging after this
我有一些擔心調用sleep這個頻率可能會出現問題,我已經試過增加10至250的睡眠時間只是爲了緩和局勢。這確實有助於改善問題,但隨着時間的推移,我仍然會遇到同樣的問題 - 我穩定地泄漏線程,直到我離開堆空間。
有沒有人有任何見解這種行爲?我不認爲像Thread.sleep()
那樣基本的東西會導致這樣的問題。
這種「線程泄漏」的假設機制是什麼? 'Thread.sleep()'永不返回? – NPE 2012-01-18 17:45:54
當我看着我的jconsole線數時,我不確定還有什麼叫它,它以30度的角度攀爬了18個小時。新線程不斷創建,所有舊線程都停留在上面列出的「等待狀態」位置。 – AWT 2012-01-18 17:54:52