Имам жив индекс Lucene, който се актуализира през целия ден. Когато се получат няколко последователни партиди от актуализации за индекса, искам тези актуализации да бъдат достъпни за търсене възможно най-бързо. Затова трябва да пресъздам IndexSearcher.
Проблемът е, че IndexSearcher може да заеме около 100mb памет и когато преминават много актуализации, той може да бъде пресъздаван сравнително често и забелязах, че .Net garbage collector изглежда бавно за почистване на препратката към стария обект на IndexSearcher . Това води до излизане извън контрол на използването на паметта на процеса, тъй като колекторът изглежда освобождава памет от стари IndexSearchers по-бавно, отколкото те се създават отново.
Открих, че този проблем се смекчава чрез преминаване на линията в табу територия и извикване на GC.Collect()
, което незабавно освобождава паметта. Въздействието върху производителността не изглежда забележимо, но тъй като правя нещо, срещу което много съвети, бих бил любопитен дали някой друг има опит с обекти, които се създават и освобождават по-бързо, отколкото събирачът на боклук ги почиства. Ще ми е особено интересно, ако някой е имал този проблем с Lucene IndexSearcher.
Трябва да отбележа, че IndexSearcher се пресъздава в пиковите моменти около веднъж на всеки 10-20 секунди.