AWT*_*AWT 4 java memory-leaks sleep thread-sleep
所以我继承了一些等待来自网络源的通信的代码.
当它正在等待来自网络套接字的更多数据时,会Thread.sleep(10)被调用.这似乎导致了线程泄漏,正如jconsole和我的线程转储所报告的那样(Thread-68,Thread-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)
Run Code Online (Sandbox Code Playgroud)
有问题的代码:
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
Run Code Online (Sandbox Code Playgroud)
我担心用这个频率调用睡眠可能会导致问题,我尝试将睡眠时间从10增加到250只是为了缓解这种情况.这确实有所改善,但随着时间的推移,我仍然遇到同样的问题 - 我一直在泄漏线程,直到我没有堆空间.
有没有人对这种行为有任何见解?我不认为Thread.sleep()像这样会导致问题的基本内容.
Thread.sleep()肯定不是问题.它不会创建任何线程等.
我只能猜测isRunning从未设置(或由于同步性差而无法看到更改)并且在旧的线程仍在运行时创建新线程.
BTW而不是不断调用available和休眠线程可以简单地阻止input.read().代码会更简单,响应更快.
问题不在于Thread.sleep(),它与线程的逻辑有关.
从您发布的代码中,线程将在何时终止isRunning = false.现在,唯一的办法isRunning被设置为false当input.available()返回正值,随后input.read()返回一个负值.
在那种情况下似乎没有任何世界状态.
因此,使用此run()方法的所有线程都将在该进程存活期间存活,并且大部分时间都在其中Thread.sleep().
PS这是基于您发布的代码.如果有办法isRunning将被设置为false你目前没有显示,请更新您的问题.
| 归档时间: |
|
| 查看次数: |
5215 次 |
| 最近记录: |