想到对方服务端最近总是登录不上,会不会是断线重连的代码有问题。新手程序员第一次遇到这种问题,没有任何报错日志,请各位大佬赐教。
这里是 GC 情况、实例数和假死前最后的日志: https://imgur.com/a/9AKTlBz
1
ql562482472 2023-03-04 11:03:54 +08:00
看看代码才知道 日志没看出来啥东西
|
2
voidmnwzp 2023-03-04 11:19:49 +08:00 via iPhone
这个问题我之前遇到过 排查过是堆外内存溢出导致的
要设置下堆外内存的限制 -XX:MaxDirectMemorySize |
3
ezksdo 2023-03-04 11:24:50 +08:00
看上去是连接没有正确关闭,把队列塞满了,或者像你说的重连的逻辑有问题。
ogen 100% 而 metaspace 美满,内存泄漏应该不是主要原因。 |
4
panjiaming OP @voidmnwzp 好的我去试一下这个参数。之前设置了-Xms1024m -Xmx2048m 反而假死的更快了,本来半个月才假死,设置完几个小时就假死了,后来就给去掉了=-=
|
5
codingbody 2023-03-04 11:36:19 +08:00 via iPhone
假死是什么意思?
|
6
panjiaming OP @codingbody 进程还在但是程序不运行了
|
7
panjiaming OP |
8
mango88 2023-03-04 14:38:03 +08:00
没看到关闭 EventLoopGroup 的代码
|
9
ql562482472 2023-03-04 14:43:24 +08:00
你这些代码我也没看出来问题,不过我说一下我的思路啊:
1 )进程还在但程序不运行,我理解是无法接收到新的消息,那么这里是不是有可能是:Socket 这边接受数据的缓冲区满了之后,没有被读走?这里是接受器有异常,循环 block 了? 2 )内存满了,但没有 OOM ,堆内存没有被释放,但是并没有继续申请新内存,因为如果申请了就应该 OOM 才对? 3 )还有可能就是堆外内存不足,Netty 没有堆外内存,就不会继续读请求,是不是有一个特别大的请求,一直没有传完?而且之前在 pipeline 上处理的信息没结束,之前的堆外内存也没有释放,没结束可能是哪里执行特别耗时 /卡死什么的? 你这些请求有没有规律?会不会有一些特定的功能号的连续调用引起的? |
10
Ericcccccccc 2023-03-04 14:45:51 +08:00
先把内存加大.
|
11
panjiaming OP @mango88 刚才把 connect 方法发给 ChatGPT 看,它也说没有关闭 EventLoopGroup 会导致内存溢出,我去改下代码再部署试试
|
12
urnoob 2023-03-04 16:14:18 +08:00 via Android
看代码片段,就是奇怪的逻辑。
channel inactive 为啥要 new client 去 connect 完全不需要这句代码。 connect 代码每次都要从头建一遍 bootstrap 那些,拿现在的重新 connect 一下不就好了么,连 listener 都不用 new 另外常量赋值有线程安全问题。为啥要 sleep thread 毫无理由的写法 写的人没理解 netty |
13
ezksdo 2023-03-04 17:46:12 +08:00
@panjiaming 你应该复用 EventLoop ,而不是一直重新创建 eventloop
|
14
1461665214 2023-03-05 12:20:47 +08:00
看了下代码 感觉是你写的有问题 new Client 每次都创建新的线程组 每个线程组默认 CPU 核心数*2 你在应该是线程过多把 CPU 和内存资源都占了导致的
|