1

我目前正在开发一项 IMAP 服务,该服务从 Gmail 中提取用户电子邮件的滑动窗口,并将其存储在本地,以提高性能。传输、解码和存储电子邮件是可行的,但是通过 IMAP IDLE 命令空闲的线程在保持活力方面遇到了困难。

怎么了?线程通过运行 rake 任务启动,每个用户一个线程。这工作正常,如果 IMAP IDLE 信号丢失、连接重置或线程死亡,我将重新启动有问题的线程。但是代码似乎会导致内存泄漏或其他原因,从而导致线程饥饿。换句话说,由于没有收到 IMAP IDLE 信号,线程被成功识别为死亡,但是当我尝试重新启动它们时,线程不会自行执行。

更具体地说,内存使用量在几天内从64 MiB 增加到 >300 MiB ,可能导致线程不足。不过,我不确定这一点。在登台机器上使用较少的线程(仅 15 个用户 = 15 个线程,加上 Ruby IMAP 库中的 15 个额外线程)进行调试并计算创建的对象时,只能发现内存使用量的增加可以忽略不计。

因此,我的问题是...... ;)

  • 如何正确调试?
  • Ruby 是否存在线程饥饿问题?我们也尝试过 JRuby,但无济于事。
  • 还有其他人是否遇到过或是否有其他人遇到过类似的问题?
4

1 回答 1

0

这是一个很长的尝试,但是如果您怀疑您的代码或某些库泄漏了线程或内存,您可以尝试使用 Plumbr与您的应用程序的 JRuby 版本。Plumbr 的主要目标是发现 Java 应用程序中的内存泄漏,但我们也有一些基于 JVM 的语言的成功案例。

于 2012-09-19T06:54:18.760 回答