jetty9 websocket发送消息死锁,引发内存溢出_愤怒的菜鸟-程序员宅基地_websocket导致内存溢出

技术标签: websocket  

这个可能是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查看线程,确实发现某个时刻,所有发送线程都在等待某一个线程,导致整个系统卡住。尝试增加一些同步代码到业务发送类,但是没有效果。再次回到观察线程死锁,发现源头是websocket内部的死锁,通过翻阅jetty源码,可以看到sendbytes后,有一个条件锁await的调用,这个时候就是等待,直到条件被激活,然后释放,发送完成。


可能到这里,大概能推断死锁的原因了。因为线上环境终端行为是比较复杂的,从错误日志里面经常可以看到各种异常断开连接的错误信息。如果在某个特殊情况下,向某个终端发送消息,这时终端异常断开,但是websocket这边并没有捕获到这个异常,就没法释放掉发送同步锁,从而导致死锁。追踪了一下jetty源码,因为比较复杂,没有找到释放的调用源头。


换一个思路去解决这个问题,使用异步发送方法。通过源码分析,异步发送跟同步发送,差异在于传入的callback不同。同步显然就是一个同步锁,异步就是future。也就是我们采用异步方法推送消息,不管结果如何,这样就能保证不死锁。对于我们的业务场景,确实也不需要保证发送成功,所以此方案可行。经过一段时间线上运行,内存溢出问题不再出现。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/candyzh/article/details/74906202

智能推荐

JVM实战:JVM命令行监控工具_Java识堂的博客-程序员宅基地_jvm命令行监控工具

介绍在生产环境中,经常会遇到各种各样奇葩的性能问题,所以掌握最基本的JVM命令行监控工具还是很有必要的名称主要作用jps查看正在运行的Java进程jstack打印线程快照jmap导出堆内存映像文件jstat查看jvm统计信息jinfo实时查看和修改jvm配置参数jhat用于分析heapdump文件jps:查看正在运行的Java进程jps可以列出正在运行的Java进程,并显示虚拟机执行主类(Main Class,main()函数所在的.

SpringBoot配置文件值注入_zhoujian_Liu的博客-程序员宅基地

springboot配置文件值注入有两种:① @Value② 将配置文件和Bean进行映射,使用 @ConfigurationProperties注入1、导入pom文件  <dependency> <groupId>org.springframework.boot</groupId> ...

Linux系统中的文件权限管理(1) ---查看、读取、文件保留权限(umask)、改变文件的权限、所有人和所有组_Horizon_carry的博客-程序员宅基地

一、文件权限查看及读取1.文件权限文件权限存在的意义 系统最底层安全设定方法之一 保证文件可以被可用的用户做相应操作2.文件权限的查看ls -l file ##查看文件权限 ls -ld dir ##查看目录权限3.文件权限的读取文件的属性被叫做文件的元数据(meta date) 一种元数据用1个b...

《研究生篇》_张一西的博客-程序员宅基地

研究生入学篇   结束了百无聊赖的暑期生活,迎来了9月份崭新的研究生学术生涯。本科毕业后,自己给自己在暑假制定了很多之前没有实现的目标,理想很丰满,现实是自己在家根本没有动力去学,只想每天躺在床上玩手机,就这样慌慌张张玩了一个多月的手机(之后才知道同学们暑期都是各种实习+兼职+提前入学,或许不回家是提高自己生活质量最有效的方法)。相比入学前,入学后的感觉确实不一样,觉得充满了斗志并且找到了...

云计算机提供什么优势,云服务器可以给我们带来什么实际的好处和价值?_焦秀文的博客-程序员宅基地

云计算是技术发展到现阶段的趋势性应用模式,面对越来越丰富的基于“云”的互联网应用,用户事实上已经在享受云计算所带来的诸多变革了。对于客户而言,选择云计算服务或是具体的云服务器产品,将会很快的意识到如下的业务变化:有效业务降低运营成本明显提高业务环境管理效率降低业务部署的难度,提高部署效率提高业务的可靠性与连续性同时,由于天互云计算服务平台建设在西安电信等核心数据中心,其服务品质与可靠性均会得到有力...

tensorflow读取训练数据方法_weixin_30762087的博客-程序员宅基地

1. 预加载数据 Preloaded data# coding: utf-8import tensorflow as tf# 设计Graphx1 = tf.constant([2, 3, 4])x2 = tf.constant([4, 0, 1])y = tf.add(x1, x2)with tf.Session() as sess: prin...

随便推点

IntersectionObserver 和懒加载_云影sky的博客-程序员宅基地

IntersectionObserver 这个 API 平常可能听得比较少,caniuse[1] 兼容性报告目前支持率是 90.12%,还不推荐用于大众化的场景中,但是它的能力和性能非常...

java实习面试题_Java实习生面试题集锦_大数据无毛兽的博客-程序员宅基地

面临金九银十的黄金跳槽季,不光是很多在职人员跃跃欲试,也有很多大学生积极地加入到应聘行列。对于Java程序员来说,至少是两关的面试,这首个关卡就是笔试,今天千锋深圳Java培训的老师总结了一些关于Java的面试题,希望能帮助到正在求职的你!1、Java的数据结构你用过那些?map与set的本质区别是什么数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。依据逻辑关系,数据结构分为:线性和...

Java网络爬虫crawler4j学习笔记<5> TLDList类_haoshenwang的博客-程序员宅基地

源代码package edu.uci.ics.crawler4j.url;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net

linux卸载已安装mysql_linux 卸载、安装mysql_weixin_39553272的博客-程序员宅基地

系统:centos 5.5 32位系统一、卸载1、查找以前是否装有mysql[[email protected]]#rpm-qa|grep-imysqlperl-DBD-MySQL-3.0007-2.el5mysql55-mysql-5.5.45-1.el5mysql55-runtime-1-12.el5mysql55-mysql-server-5.5.45-1.el5lib...

Torch常用代码段合集_爱CV的博客-程序员宅基地_torch代码

本文是PyTorch常用代码段合集,涵盖基本配置、张量处理、模型定义与操作、数据处理、模型训练与测试等5个方面,还给出了多个值得注意的Tips,内容非常全面。PyTorch最好的资料是官方文档。本文是PyTorch常用代码段,在参考资料[1](张皓:PyTorch Cookbook)的基础上做了一些修补,方便使用时查阅。1.基本配置导入包和版本查询import torchimport torch.nn as nnimport torchvisionprint(torch.__version

涨薪之源码:架构进阶必备,Spring全家桶源码解读_普通网友的博客-程序员宅基地

最近很多人留言说今年找工作太难了,要涨薪几乎更难了 !真的就这么悲观吗?其实不然,我们企业一直都在大量的招人,一直都没停过。只是一点和之前不一样要求变高了,优秀的人一直都缺。帮忙转发一下,关注后添加助理vx:yunduoa2019或扫描下图二维码,跟随助理指引自行获取我身边朋友所在的大厂也一样比平时的要求更高了,优秀的人给出薪水甚至比平时还高,因为优秀的人产出高,效率高,特殊时期企业压力也大这样的人才能给企业创造更大的价值,企业才能发展。我就在思考怎么用好这段时间快速把我们自身的能力提升上来

推荐文章

热门文章

相关标签