Dan_Suitor Ответов: 0

Вопрос о сборке мусора


В 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(), хотя это и не рекомендуется.

0 Ответов