jetty9 websocket发送消息死锁,引发内存溢出

本文介绍了在使用Jetty9 WebSocket时遇到的死锁问题,导致内存溢出。通过分析,发现WebSocket的sendBytes方法中的条件锁在特定情况下未能释放,引发问题。解决方案是改用异步发送方法,避免同步锁导致的死锁,有效解决了内存溢出的问题。
摘要由CSDN通过智能技术生成

这个可能是jetty websocke考虑不周的地方,应该在lock.await()加个超时限制lock.await(10000),以防止这种异常不能释放锁的情况。

今天看了下tomcat websocket的实现,果然是有超时控制。

---------- 2017.7.14 补充 -------------------

最近在做一个金融项目,做了一个网关,用来对接各种终端,长连接不断推送期货行情。(jetty9 websocket)


长连接的方案采用websocket,上线前,做单个终端的压力测试,传输数百万数据,跑了10多小时,一切正常。但是上线后,发现时间不规则的内存溢出,有时可能4天就死了,有时半天就死了,甚是郁闷。


dump出内存堆,使用mat分析,很容易看到byte[]非常大,占60%内存。我们知道,当分析内存溢出的难点之一,就是没有特征类。这个时候需要去自己分析业务代码进行定位。我的网关功能,是从kafka上获取数据,然后通过websocket分发到各个终端。为了提高性能,内部有一个blockqueue作为内存缓冲队列,而blockqueue里面装的就是byte[]。然后通过mat查看byte[]内容,果不其然,就是队列的消息。剩下的问题就是追查为何内存队列消息没有被消费掉,奇怪的是,为什么网关一开始启动的时候,是可以正常工作的?


最开始以为消费线程死掉,经过一轮排查和测试后,发现不是这个问题。那会不会是线程死锁呢,通过jconsole查看线程,确实发现某个时刻&

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值