由于排序和命中索引中的所有元素而导致内存增长

时间:2014-02-19 22:33:42

标签: solr lucene

我使用lucene创建了200万个条目的索引(我的主程序在启动时只有30 MB RAM)

然后我继续在循环中运行以搜索按时间排序的条目,并在我的循环中,我确保我点击我的lucene索引中的每个条目并立即释放它(我甚至不使用它)。这导致内存从30MB RAM增长到90MB RAM。我运行了一个jmap转储并在之后加载到eclipse中。

罪魁祸首原来是FieldCacheImpl $ SortedDocValuesCache中的一个条目,它有一个名为readerCache的WeakHashMap(在SortedDocValuesCache的超类中称为Cache)。

更糟糕的是,在生产中,这个东西增长到大约40Gig(我们有一台120G RAM机器)。我想知道我是否可以在生产中消除这个问题并显着降低RAM而不会对性能造成太大影响?

在Cache内部类的FieldCacheImpl.java中有这一行

final Map<Object,Map<CacheKey,Object>> readerCache = new WeakHashMap<Object,Map<CacheKey,Object>>();

请注意,我很确定它只是这个地图中的一个条目,一直在增长和增长,我想从来没有收集垃圾,因为索引一直在使用?

有谁知道这是怎么回事? (这是一个非常简单的测试用例,非常可重复)。

如果重要的话,我正在使用MMapDirectory。

编辑: 哦,顺便说一句,弱hashmap的关键是SegmentCoreReader。一个weakHashmap意味着这个键在某些时候会被垃圾收集,但显然它永远不会被垃圾收集,我不知道它是否被垃圾收集,我的性能是否会被收集,我也不知道如何确保它被释放和垃圾收集。

感谢, 迪安

1 个答案:

答案 0 :(得分:2)

在排序过程中,fieldcache使用您排序的值填充数组。这会产生你需要的内存量。缓存仍然是为了加速下次排序。只有在关联的IndexReader被垃圾回收时才会释放FieldCache。