java程序中如果有死循环运行一段时间后会死掉吗?

时间:2023-01-26 15:21:37
是这样的,我写的一个java程序,用来做socket连接收发信息,里面有死循环,一直监听socket端口,但是运行一段时间之后,发现连接我程序就连不上了,是怎么回事呢?现在大概有60个终端在通过socket连接我的程序。程序连不上的时候也没有报任何异常。大家帮忙分析下是什么原因呢?
线程池用的是这个: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,把该关闭的地方关闭就好了。谢谢各位的回答和意见。