spark内存泄露的问题及解决

博客讨论了Spark应用在处理多个对话请求或会议室时出现的内存泄漏问题。通过jconsole和jprofile分析,发现GroupChatRoom对象和MultiUserChat对象在关闭后仍存在,无法被垃圾回收。问题根源在于ChatTranscriptManager的lastMessage持久引用未正确清理,以及MultiUserChat的引用链导致的对象无法释放。解决方案包括改进filterChatRoom方法和在离开时解除MultiUserChat的引用。
摘要由CSDN通过智能技术生成

客户端接受多个对话请求或者打开多个会议室之后会堆内存耗尽而退出,使用jconsole检测可以发现它对堆内存的占用只升不降,使用jprofile可以发现关闭聊天室之后GroupChatRoom对象仍然存在,并且只增不减不能被垃圾回收最终耗尽堆内存,控制台抛出OuOfMemoryError。

 

jprofile可以查看存留对象的引用图(References Graph),从左边分析哪些对它的引用会导致它不能被垃圾回收,还可以计算到GC(垃圾回收)的路径,从这里可以查看路径中是否有全局对象。最后发现ChatTranscriptManager保存了对GroupChatRoom的持久引用,它没有恰当地从lastMessage中移除ChatRoom,并且由它注册的ChatRoomListener和被其他类调用的persistChatRoom(ChatRoom)在保存聊天记录时对ChatRoom的过滤不一致,前者只接受ChatRoomImpl实例,后者接受所有ChatRoom实例(包括GroupChatRoom实例),建议使用统一的filterChatRoom(ChatRoom)过滤合适的ChatRoom,并且在chatRoomClosed时从lastMessage中移除ChatRoom键。

 

同时还可以发现MultiUserChat也是只升不降,同样的分析可以发现存在这样的引用链MultiUserChat <- presenceListener <-

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值