У меня есть класс, который реализует Runnable
и в настоящее время я использую Executor в качестве пула потоков для запуска задач (индексирование документов в Lucene).Лучший способ повторного использования Runnable
executor.execute(new LuceneDocIndexer(doc, writer));
Моя проблема заключается в том, что мой Runnable класс создает много Lucene Field
объектов, и я предпочел бы повторно использовать их тогда создавать новые каждый вызов. Каков наилучший способ повторного использования этих объектов (объекты Field
не являются потокобезопасными, поэтому я не могу сделать их статичными) - должен ли я создать свой собственный ThreadFactory
? Я замечаю, что через некоторое время программа начинает резко ухудшаться, и единственное, о чем я могу думать, это накладные расходы на GC. В настоящее время я пытаюсь профилировать проект, чтобы убедиться, что это даже проблема, но пока давайте просто предположим, что это так.
У меня нет предыдущего опыта в Lucene; но можно ли использовать пул объектов «Поле»? –
Каждый объект «Поле» отличается (например, 6 на каждый документ), поэтому использование одного пула общих объектов не будет работать. Я также не хочу отслеживать 6 пулов объектов, которые должны быть того же размера, что и мой пул потоков, поэтому, если я когда-либо изменю размер пула потоков, я должен изменить размер пула объектов - не звучит очень ремонтопригодны. – Gandalf
GC должен быть оптимизирован для работы с небольшими выделениями, которые быстро исчезают, поскольку это такой распространенный вариант использования. Я не знаком с Lucene, но если объекты Field достаточно малы и достаточно короткими, вероятность того, что они выделены в стеке JIT и даже не достигнут GC. – Skrud