默认
发表评论 14
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 求助基于MobileIMSDK的IM服务端集成到springboot后发生OOM
阅读(33187) | 评论(14 收藏 淘帖1
springboot工程集成了IM,部署在了Linux服务器的Tomcat里。IM工程会报下面这个错误,最终导致tomcat崩溃。求有经验的大佬帮忙分析下原因。

io.netty.util.concurrent.DefaultPromise.notifyListener0 An exception was thrown by net.x52im.mobileimsdk.server.utils.LocalSendHelper$1.operationComplete()
        java.lang.OutOfMemoryError: unable to create new native thread
                at java.lang.Thread.start0(Native Method)
                at java.lang.Thread.start(Thread.java:717)
                at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:957)
                at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1378)
                at okhttp3.internal.connection.RealConnectionPool.put(RealConnectionPool.java:120)
                at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.java:243)
                at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.java:108)
                at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.java:88)
                at okhttp3.internal.connection.Transmitter.newExchange(Transmitter.java:169)
                at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:41)
                at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
                at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
                at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94)
                at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
                at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
                at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
                at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
                at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:88)
                at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
                at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
                at com.im.http.ApiManager.lambda$getApi$9(ApiManager.java:39)
                at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
                at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
                at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:229)
                at okhttp3.RealCall.execute(RealCall.java:81)
                at retrofit2.OkHttpCall.execute(OkHttpCall.java:188)
                at com.im.im.ServerEventListenerImpl.recordIMMsg(ServerEventListenerImpl.java:496)
                at com.im.im.ServerEventListenerImpl.onTransferMessage4C2C(ServerEventListenerImpl.java:298)
                at net.x52im.mobileimsdk.server.utils.GlobalSendHelper$2.update(GlobalSendHelper.java:186)
                at net.x52im.mobileimsdk.server.utils.LocalSendHelper$1.operationComplete(LocalSendHelper.java:335)
                at net.x52im.mobileimsdk.server.utils.LocalSendHelper$1.operationComplete(LocalSendHelper.java:1)
                at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:577)
                at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:551)
                at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:490)
                at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:615)
                at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:604)
                at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
                at io.netty.util.concurrent.PromiseCombiner.tryPromise(PromiseCombiner.java:170)
                at io.netty.util.concurrent.PromiseCombiner.access$600(PromiseCombiner.java:35)
                at io.netty.util.concurrent.PromiseCombiner$1.operationComplete0(PromiseCombiner.java:62)
                at io.netty.util.concurrent.PromiseCombiner$1.operationComplete(PromiseCombiner.java:44)
                at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:577)
                at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:551)
                at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:490)
                at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:615)
                at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:604)
                at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104)
                at io.netty.util.internal.PromiseNotificationUtil.trySuccess(PromiseNotificationUtil.java:48)
                at io.netty.channel.ChannelOutboundBuffer.safeSuccess(ChannelOutboundBuffer.java:717)
                at io.netty.channel.ChannelOutboundBuffer.remove(ChannelOutboundBuffer.java:272)
                at io.netty.channel.ChannelOutboundBuffer.removeBytes(ChannelOutboundBuffer.java:352)
                at io.netty.channel.socket.nio.NioSocketChannel.doWrite(NioSocketChannel.java:431)
                at io.netty.channel.AbstractChannel$AbstractUnsafe.flush0(AbstractChannel.java:930)
                at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0(AbstractNioChannel.java:354)
                at io.netty.channel.AbstractChannel$AbstractUnsafe.flush(AbstractChannel.java:897)
                at io.netty.channel.DefaultChannelPipeline$HeadContext.flush(DefaultChannelPipeline.java:1372)
                at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750)
                at io.netty.channel.AbstractChannelHandlerContext.invokeFlush(AbstractChannelHandlerContext.java:742)
                at io.netty.channel.AbstractChannelHandlerContext.flush(AbstractChannelHandlerContext.java:728)
                at io.netty.channel.ChannelDuplexHandler.flush(ChannelDuplexHandler.java:127)
                at io.netty.channel.AbstractChannelHandlerContext.invokeFlush0(AbstractChannelHandlerContext.java:750)
                at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:765)
                at io.netty.channel.AbstractChannelHandlerContext$WriteTask.run(AbstractChannelHandlerContext.java:1071)
                at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
                at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
                at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:497)
                at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
                at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
                at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
                at java.lang.Thread.run(Thread.java:748)


即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:[已回复] 求教登录MobileIMSDK失败回调后,为何客户端还一直在监听下一篇:[已回复] 如何在Application全局注册MobileIMSDK事件监听,渲染不同页面

本帖已收录至以下技术专辑

推荐方案
评论 14
我看到里面有调用okhttp的栈信息,你是在这个回调里实现什么业务?你可以具体说说
引用:JackJiang 发表于 2022-03-22 17:27
我看到里面有调用okhttp的栈信息,你是在这个回调里实现什么业务?你可以具体说说

用它调了一个接口,接口的作用是记录IM消息
引用:koup 发表于 2022-03-23 09:44
用它调了一个接口,接口的作用是记录IM消息

客户端每次发送消息,都会在回调里调用消息记录保存接口。
引用:koup 发表于 2022-03-23 09:45
客户端每次发送消息,都会在回调里调用消息记录保存接口。

消息记录保存接口是个http?
引用:JackJiang 发表于 2022-03-23 10:27
消息记录保存接口是个http?

是的

我估计问题有可能就出在这里。你把im回调接口里的你加的这一块的代码,全部注释掉,对照一下看看,OOM还会不会发生
引用:JackJiang 发表于 2022-03-23 11:41
我估计问题有可能就出在这里。你把im回调接口里的你加的这一块的代码,全部注释掉,对照一下看看,OOM还 ...

可以试试。您能大概解释一下原因吗
引用:koup 发表于 2022-03-23 14:22
可以试试。您能大概解释一下原因吗

你先试试看是不是这个原因,然后再来看你代码是怎么写的
引用:JackJiang 发表于 2022-03-23 14:36
你先试试看是不是这个原因,然后再来看你代码是怎么写的

IM如果登录不上,会频繁尝试登录吗?我们今天发现一个用户以0.001秒的间隔频繁登录了20多次,导致了类似的OOM错误(登录回调里会使用retrofit调用接口)
引用:koup 发表于 2022-04-27 18:11
IM如果登录不上,会频繁尝试登录吗?我们今天发现一个用户以0.001秒的间隔频繁登录了20多次,导致了类似 ...

0.001秒间隔不可能,正常情况是隔几秒尝试一次。有改动什么逻辑吗?
引用:JackJiang 发表于 2022-04-27 20:05
0.001秒间隔不可能,正常情况是隔几秒尝试一次。有改动什么逻辑吗?

im可以怎么改造,防止频繁登录呢?减少并发
引用:koup 发表于 2022-04-28 15:29
im可以怎么改造,防止频繁登录呢?减少并发

你指的“频繁登录”,意思是你这0.001间隔登陆一次?如果0.001间隔登陆一次那肯定是代码有问题,需要检查代码
引用:JackJiang 发表于 2022-04-28 18:25
你指的“频繁登录”,意思是你这0.001间隔登陆一次?如果0.001间隔登陆一次那肯定是代码有问题,需要检查 ...

您指的是客户端代码?
再请教一个问题,如果网络波动造成客户端掉线,在网络波动这段时间内,我们让客户端一直尝试重连。之后网络恢复正常,重连的多个请求会一起发出,造成并发吗?
引用:koup 发表于 2022-04-29 11:08
您指的是客户端代码?
再请教一个问题,如果网络波动造成客户端掉线,在网络波动这段时间内,我们让客户 ...

不会合并,正常情况下,重连间隔你肯定得给个几秒(如果是随机的就更好),不然一旦服务器崩掉或重启后,那瞬间的流量过来,跟DDoS攻击没俩样。。。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部