线程池用的是这个:ThreadPoolExecutor,最大线程数设置为了10000,但是调用的时候我是这样写的:
ServerSocket server;
try {
server = new ServerSocket(6000);
while(true)
{
threadPool.execute(new ThreadTask(server.accept()));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
10 个解决方案
#1
如果jvm能在溢出前回收不用的,不会死机,这要看jvm的机制了。
#2
连接不上是因为socket已经关闭了?服务器这边是不是要检测线程池是否已满。需要一个专门接待的主socket线程否则接待、判断线程池是否可用、不可用给客户端一个消息,保证主socket独立并且正常运行,是否要加入心跳机制。
#3
内存占满后会内存溢出
#4
谢谢大家的回答,我是楼主。在我程序中,没有主动断开过socket连接,我是用while(true)来等待socket连接的,程序运行四五天后,大部分socket的就连不上了。重起后又正常。
#5
如果内存溢出也应该报错,但是偏偏没有任何报错信息。
#6
我是楼主,这个问题,我之前一直以为是内存的问题,但是昨天我在自己电脑做了个试验,就是当连接数超过线程池最大数的时候,就会出现连接上但收不到消息的情况。但是我线程池最大连接数是1万条,而终端只有50台左右,怎么会出现超过最大连接数的现象呢?是否是连接没有释放的原因?对线程池还是不太了解,请高手指教一二
#7
循环里面加上日志,看看到底添加了多少个线程。有可能客户端重连导致多添加线程了
#8
朋友,解决了吗,我现在也碰到了个这样的问题··· socket连接四五天后就连接不上了
#9
你服务器端 响应客户端连接请求的socket 没有设读超时吧。
#10
抱歉各位结贴结晚了,这个是比较久之前的问题。我后来仔细检查了代码,其实之前通过我的描述也能看出,是因为从连接池里取出连接之后没有关闭,导致连接池用光了,so,把该关闭的地方关闭就好了。谢谢各位的回答和意见。
#1
如果jvm能在溢出前回收不用的,不会死机,这要看jvm的机制了。
#2
连接不上是因为socket已经关闭了?服务器这边是不是要检测线程池是否已满。需要一个专门接待的主socket线程否则接待、判断线程池是否可用、不可用给客户端一个消息,保证主socket独立并且正常运行,是否要加入心跳机制。
#3
内存占满后会内存溢出
#4
谢谢大家的回答,我是楼主。在我程序中,没有主动断开过socket连接,我是用while(true)来等待socket连接的,程序运行四五天后,大部分socket的就连不上了。重起后又正常。
#5
如果内存溢出也应该报错,但是偏偏没有任何报错信息。
#6
我是楼主,这个问题,我之前一直以为是内存的问题,但是昨天我在自己电脑做了个试验,就是当连接数超过线程池最大数的时候,就会出现连接上但收不到消息的情况。但是我线程池最大连接数是1万条,而终端只有50台左右,怎么会出现超过最大连接数的现象呢?是否是连接没有释放的原因?对线程池还是不太了解,请高手指教一二
#7
循环里面加上日志,看看到底添加了多少个线程。有可能客户端重连导致多添加线程了
#8
朋友,解决了吗,我现在也碰到了个这样的问题··· socket连接四五天后就连接不上了
#9
你服务器端 响应客户端连接请求的socket 没有设读超时吧。
#10
抱歉各位结贴结晚了,这个是比较久之前的问题。我后来仔细检查了代码,其实之前通过我的描述也能看出,是因为从连接池里取出连接之后没有关闭,导致连接池用光了,so,把该关闭的地方关闭就好了。谢谢各位的回答和意见。