Я запускаю много потоков одновременно, каждый из которых записывает/считывает данные в/из очереди; Данные разворачиваются постепенно, пока они обрабатываются и сохраняются в БД. По какой-то причине память не освобождена, хотя очереди пусты, и я убедился, что вся подписка на события между устройством чтения данных и процессором данных не подписана в конце потоков. Количество присаженных ОЗУ Точно количество данных, которое считывается двоичными считывателями и помещается в очереди.Память не освобождается приложением до тех пор, пока GC не будет явно вызвана
Чтобы изолировать проблему, я обошел процедуру «Обработка» и «Хранение базы данных».
Зачем нужно, чтобы RAM оставалась на корточках долго после завершения всех потоков, до тех пор, пока я явно не позвоню GC.Collect()
или не завершаю программу? Я вручную аннулировал очередь после ее опустошения, а также аннулировал двоичный считыватель, который считывал данные. Я думал, что этого будет достаточно для того, чтобы ГК просыпаться и заниматься домашним хозяйством, по крайней мере, через несколько минут.
EDIT: The (переформулируется после удаления) ВОПРОС: Короче говоря, я всегда говорил, что поведение ГХ по умолчанию удалось память должным образом и что я не буду почти никогда не называть GC в явном виде, и пусть структура выполняет эту работу.
Я хотел бы знать, почему в этом случае использование памяти падает только тогда, когда явный вызов к GC.Collect
EDIT:
без GC Collect
С GC Collect (Вызывается на регулярной основе)
Ваша проблема может быть связана со многими вещами, не заглядывая в ваш код, довольно сложно предсказать, почему GC не использует метлу, если вы хотите, чтобы мы могли использовать VS Anywhere, чтобы просмотреть код вместе ... –
Nice graph но где проблема? –
Вы, кажется, довольно умный человек, который довольно анимирован, но вам нелегко оставаться на тему. Последней частью вашего поста является «Вопрос: ....», за которым следует смешное разглашение без прямого вопроса. Хотя я думаю, что вы уже вложили свой вопрос раньше в свой пост –