Вопрос о сборке мусора
В DebugDiag:
Следующие потоки в Zetta_160502_185436. dmp ждут завершения сборки мусора .net. Поток 105 запустил сборку мусора.Поток сборщика gargage не начнет выполнять свою работу до тех пор, пока потоки, у которых отключен упреждающий GC, не закончат выполнение. Следующие потоки имеют упреждающий GC отключен 105.
Поток 105-это единственный поток, который не является упреждающим. Он указан как кооперативный.
Глядя на стек вызовов для потока 105, он вызывает метод PerformanceCounter NextValue (), который в конечном итоге вызывает RegistryKey.InternalGetValue. В этом методе он создает большой массив байтов размером не менее 65 000 байт. Я думаю, что именно здесь требуется дополнительная память, а значит, и запуск сборки мусора. Дело в том, что я не вижу нигде, где можно было бы изменить режим GC.
Мои вопросы таковы:
Как может данный поток ждать самого себя до начала GC?
Как в режиме ГХ-нить переодеться в кооператив?
Спасибо
Дэн
Что я уже пробовал:
Из-за этого условия мы постоянно получаем исключения из памяти, но я не знаю, что изменить, чтобы исправить это.
Patrice T
Вам лучше попытаться понять, где и зачем вам нужно так много памяти.
Richard MacCutchan
Если ваши потоки препятствуют запуску GC, значит, с вашим приложением что-то не так. Это то, что вам нужно решить и исправить. Вы можете вызвать GC непосредственно в одном из ваших потоков, если это необходимо. System.GC.Collect()
, хотя это и не рекомендуется.