Что делать, если сборка мусора в .Net медленнее, чем скорость создания / удаления объектов? - PullRequest
3 голосов
/ 27 июля 2011

У меня есть живой индекс Lucene, который обновляется в течение дня. Когда поступит несколько последовательных пакетов обновлений для индекса, я хочу, чтобы эти обновления были доступны для поиска как можно быстрее. Поэтому мне нужно пересоздать IndexSearcher.

Проблема в том, что IndexSearcher может занимать около 100 МБ памяти, а когда поступает много обновлений, он может создаваться сравнительно часто, и я заметил, что сборщик мусора .Net медленно очищает ссылку на старый объект IndexSearcher. Это приводит к тому, что использование памяти процессом выходит из-под контроля, поскольку сборщик, похоже, освобождает память от старых IndexSearchers медленнее, чем они воссоздаются.

Я обнаружил, что эту проблему можно решить путем пересечения линии на территорию табу и вызова GC.Collect(), что немедленно освобождает память. Влияние на производительность не кажется заметным, но, поскольку я делаю что-то, против чего много советов, мне было бы любопытно, если бы кто-то еще имел опыт создания и выпуска объектов быстрее, чем сборщик мусора их очищает. Мне было бы особенно интересно, если бы у кого-то была такая проблема с Lucene IndexSearcher.

Я должен отметить, что IndexSearcher воссоздается в пиковое время примерно каждые 10-20 секунд.

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Я считаю допустимым вызывать GC.Collect, если вы только что освободили тонну памяти, и память можно и нужно освободить сейчас, чтобы уменьшить нагрузку на память. GC не знает, что эта память теперь доступна, пока она не запустится снова, и вы не знаете, когда это будет.

В вашем случае вы сказали, что "его можно воссоздавать относительно часто". Если это так, вызов GC.Collect при воссоздании звучит разумно.

2 голосов
/ 27 июля 2011

Вы пытались настроить сборку мусора для сервера? Я считаю, что это отличается тем, что GC находится в другом потоке:

Должны ли мы использовать сборщик мусора "рабочая станция" или сборщик мусора "сервер"?

Что касается «быстрее, чем очистка», если память доступна, система предоставит ее вашему процессу. Сборщик мусора будет собираться на разных стыках по мере роста памяти, но он не остановит выделения для поддержания определенного уровня нагрузки на память - ОС управляет нагрузкой.

К сожалению, у меня нет непосредственного опыта работы с Lucene, поэтому мой ответ о сборке мусора в целом.

...