(生产事故)openfire内存只增不减,也一直不GC

我们有一个老项目是基于openfire开发的客服以及消息推送,用户总量在300W左右,高峰期同时在线是5W人左右

 

第一次运维反馈openfire使用内存比例占用一直在50%以上,居高不下

因为是老项目,也没有特别重视(1,老项目,2,没专人维护),我们的反馈是让运维重启

 

第二次,运行一两周以后,运维又找上我,说是内存还是占用过高,但是没有分析堆栈信息,主要从几个方面来分析

1,查询到jdk版本,发现生产上居然配置的是openjdk(系统自带),不是oracle版本jdk(晚上很多资料说openjdk不释放内存)

2,经过检查openfire启动脚本文件发现文件没有配置java空间大小,机器是16G内存,改大使用10G 

 INSTALL4J_ADD_VM_PARAMS="-Xms10g -Xmx10G -Xss256k"

3,为了防止以后用户越来越多,最后将机器内存由16G扩展到32G(同时修改INSTALL4J_ADD_VM_PARAMS为16G)

(这期间我也将生产应用部署到测试环境,始终没有重现出问题)

最后重启了应用,经过观察一天的时间,发现运行比较稳定

 

第三次,过了大约一周以后,内存占用还是超过50%,一直居高不下

这时候我也重视起来了,各种查资料,还是没有找到最终问题,无奈之后,我只能将生产代码过一遍,查看是否会存在问题

最后发现一个问题

有一个发送离线消息的队列出现了问题的线程出现了问题(离线通知:就是接收消息的用户不在线的时候,我们给他补发一条一条离线手机通知栏信息(小米华为apns))

线程原理: 使用阻塞队列,消息内存存入消息队列

//离线消息通知内存队列
 private static LinkedBlockingQueue<TKNoticeMessage> noticeMessageLinkedBlockingQuene = new LinkedBlockingQueue<TKNoticeMessage>();

然后启动多个线程去队列里面拿消息内容存储

TKNoticeMessage tkNoticeMessage = NoticeMessageQuene.getNoticeMessageLinkedBlockingQuene().take();

问题就出现这个线程里面

看截图这个  continue ,之前写的是break;

看到这里就可以知道原因了,系统运行到break之后,就直接结束了这个线程,同时也直接导致这个线程结束

线程结束之后,队列就没有地方消费了,所有内存使用就越来越大,队列也没有限制最大值

最后导致整个应用都不能使用

最后修改了这个break,内存问题就解决了

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值