我有一个jruby应用程序启动200个Threads(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
因此,每当线程正在工作并在特定集合中保存数据时,我的heapsize非常快速地达到4GB的限制。我已经使用jmap命令进行了测试,发现创建了java.util.LinkedHashMap的许多对象(约为1.300.000)。 我不知道我是否可以减少这种对象类型的数量。
Jruby中是否存在LinkedHashMaps和Memory Leaks的已知问题?
任何人都可以帮我解决这个问题吗?
THX 克里斯
答案 0 :(得分:0)
过去一周,我使用Eclipse的Memory Analyzer Tool成功追踪了我的jruby on rails应用程序中的3个内存泄漏。我强烈推荐它。在所有情况下都没有jruby本身的内存泄漏,而是其中2个在Mongoid中,而在我自己的应用程序中。然而,我注意到jruby对内存泄漏的敏感度比MRI更敏感。
另请查看此blog post使用MAT来诊断jruby中的泄漏。