0

我有一个启动 200 个线程的 jruby 应用程序(Jruby 1.7.0.preview1)。每个线程解析一个 xml 文档并将复杂的数据保存在几个 mongodb 集合中。我正在使用 Java Mongo 驱动程序(2.7.3 版)将数据存储在 mongodb 中。我的应用程序的 JVM 选项如下:

-J-Djruby.thread.pooling=true -J-Xmn512m -J-Xms4096m -J-Xmx4096m -J-XX:+UseConcMarkSweepGC -J-XX:CMSInitiatingOccupancyFraction=45 -J-XX:ParallelGCThreads=1 -J-XX:+DisableExplicitGC -J-XX:+PrintGCDetails -J-XX:+PrintGCTimeStamps -J-Xloggc:/LOGPATH/gc.log -J-Dsun.rmi.dgc.client.gcInterval=60000 -J-Dsun.rmi.dgc.server.gcInterval=60000

因此,每次线程工作并在特定集合中保存数据时,我的堆大小都会非常快地达到 4GB 的限制。我使用 jmap 命令进行了测试,发现创建了许多 java.util.LinkedHashMap 对象(大约 1.300.000)。我不知道我是否可以减少这种对象类型的数量。

Jruby 中的 LinkedHashMaps 和 Memory Leaks 是否存在已知问题?

谁能帮我解决这个问题?

谢谢克里斯

4

1 回答 1

0

过去一周,我使用 Eclipse 的内存分析器工具成功追踪了我的 jruby on rails 应用程序中的 3 个内存泄漏。我强烈推荐它。在任何情况下都不是 jruby 本身的内存泄漏,而是其中 2 个在 Mongoid 中,一次在我自己的应用程序中。然而,我注意到 jruby 比 MRI 对内存泄漏更敏感。

还可以查看这篇关于使用 MAT 诊断 jruby 泄漏的博客文章。

于 2012-10-10T15:05:55.860 回答