使用Memory Analyzer来恢复丢失的数据

前两天因为未知的原因导致我们的XMPP服务器收到大量的message,以至于服务器没法及时处理,让整个系统挂调了,重起之后弄了一个简单的filter,过滤掉符合条件的消息防止再次受到攻击。

第二天就有用户报告,说他们的聊天记录丢失了,应该就是这次攻击中淹没在海量垃圾消息中了。受到攻击当时是凌晨3点钟,当时想睡觉就用jmap把整个heap给dump出来,重起后就没管了。然后现在试着使用dump出来的heap来恢复丢失的消息。

当时用Eclipse Memory Analyzer工具,打开那个heap,发现有很多HistoryItem,这个在我们的实现中是负责索引和存储Message用的一个临时对象的类型,图中可以看出有1227837条,其中几乎所有的都是没有意义的消息。

通过谷歌得知可以使用OQL(Object Query Language)来作过滤,打开OQL查询窗口,执行以下命令:

然后查询结果只有109个:

使用工具的Export功能,将内容导出出来,然后利用我们XMPP服务器的Inspector在线执行JavaScript将导出的文件恢复到内存里,丢失数据搞定。


Last modified on 2012-08-21