【发布时间】:2010-05-05 14:46:41
【问题描述】:
我有一个实现Runnable 的类,并且目前正在使用一个执行器作为我的线程池来运行任务(将文档索引到 Lucene 中)。
executor.execute(new LuceneDocIndexer(doc, writer));
我的问题是我的 Runnable 类创建了许多 Lucene Field 对象,我宁愿重用它们,然后每次调用都创建新对象。重用这些对象的最佳方法是什么(Field 对象不是线程安全的,所以我不能简单地将它们设为静态) - 我应该创建自己的ThreadFactory 吗?我注意到一段时间后程序开始急剧下降,我唯一能想到的就是它的 GC 开销。我目前正在尝试分析该项目以确保这甚至是一个问题 - 但现在让我们假设它是。
【问题讨论】:
-
我之前没有 Lucene 的经验;但是可以使用
Field对象池吗? -
每个
Field对象都是不同的(比如每个文档有 6 个),因此使用一个通用对象池是行不通的。我也不想跟踪需要与我的线程池大小相同的 6 个对象池 - 所以如果我更改线程池大小,我必须更改对象池大小 - 听起来不太可维护。 -
应该优化 GC 以处理快速消失的小分配,因为它是如此常见的用例。我对 Lucene 不熟悉,但如果 Field 对象足够小且寿命足够短,那么它们很有可能被 JIT 分配到堆栈上,甚至永远不会到达 GC。
-
你想重用什么? Field 对象,还是 Runnables ?
-
您需要进行分析,以便您可以识别问题,而不是猜测是大量的 Field 对象导致了问题。否则,您可能会做很多工作却看不到可衡量的改进。就您的问题而言,您是否考虑过享元模式是否适合?
标签: java multithreading concurrency lucene