我使用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意味着这个键在某些时候会被垃圾收集,但显然它永远不会被垃圾收集,我不知道它是否被垃圾收集,我的性能是否会被收集,我也不知道如何确保它被释放和垃圾收集。
感谢, 迪安
答案 0 :(得分:2)
在排序过程中,fieldcache使用您排序的值填充数组。这会产生你需要的内存量。缓存仍然是为了加速下次排序。只有在关联的IndexReader被垃圾回收时才会释放FieldCache。