我有一个启动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 和内存泄漏是否存在已知问题?
谁能帮我解决这个问题?
感谢克里斯
一周里,我已经使用Eclipse的Memory Analyzer Tool成功地追踪了我的jruby on rails应用程序中的3个内存泄漏。 我强烈推荐它。 在 jruby 本身中都没有内存泄漏,而是其中 2 个在 Mongoid 中,一次在我自己的应用程序中。 然而,我注意到jruby对内存泄漏比MRI更敏感。
另请查看这篇关于使用 MAT 诊断 jruby 泄漏的博客文章。