这个可能是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查看线程,确实发现某个时刻&