C#, Что произошло бы с GC, если я выполняю процесс с приоритетом = RealTime?

У меня есть приложение C#, которое выполняет с приоритетом RealTime. Это был весь штраф, пока я не внес немного беспокойных изменений за прошедшие 2 дня. Теперь это исчерпывает память за несколько часов.

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

Мой вопрос - что могло произойти с GC, когда он пытается собрать объекты в приложении с приоритетом RealTime (существует также по крайней мере один поток, работающий с Самым Высоким приоритетом потока)?

(P.S. приоритетом в реальном времени я имею в виду Процесс. GetCurrentProcess ().PriorityClass = ProcessPriorityClass. RealTime)

Извините забыл говорить. GC находится в режиме Server

8
задан Boppity Bop 20 June 2010 в 17:13
поделиться

6 ответов

Сборщик мусора работает в вашем процессе и, следовательно, имеет такой же приоритет. На его способность к сбору не влияет PriorityClass , с которым работает ваше приложение.

Эта утечка памяти почти наверняка вызвана тем, что вы держитесь за корень растущего графа объектов, что не позволяет сборщику мусора собрать его.

12
ответ дан 5 December 2019 в 10:39
поделиться

Скорее всего, GC не может их собрать, потому что где-то у вас все еще хранится ссылка. Попробуйте профилировать ваше приложение с помощью профилировщика памяти (RedGate имеет хороший профилировщик, вы должны попробовать пробную версию), чтобы найти, почему GC не собирает ваши объекты.

2
ответ дан 5 December 2019 в 10:39
поделиться

Я действительно сомневаюсь, что приоритет реального времени является причиной вашего вопроса. Я предполагаю, что в паре упомянутых вами изменений происходит утечка памяти (что в C # обычно означает сохранение ссылок на объекты, которые больше не нужны). Вы можете использовать профилировщик памяти, WinDbg с SOS (см., Например, http://msdn.microsoft.com/en-us/magazine/cc163528.aspx ) или просто взглянуть на эти изменения и попробуйте внимательно изучить проблему.

1
ответ дан 5 December 2019 в 10:39
поделиться

Я бы серьезно не рекомендовал запускать какие-либо программы в качестве приоритета RealTime. По сути, все, что работает с приоритетом RealTime, работает с более высоким приоритетом, чем графический интерфейс или даже диспетчер задач Windows ... и, таким образом, может заблокировать самого пользователя.

Раймонд Чен говорил об этом на прошлой неделе .

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

1
ответ дан 5 December 2019 в 10:39
поделиться

Вместо того, чтобы менять приоритет потоков и, возможно, блокировать систему, вам следует использовать профилировщик памяти, чтобы определить истинную причину проблемы. Вы также можете использовать Performance Monitor для проверки счетчиков производительности в категории .NET CLR Memory, чтобы увидеть, сколько памяти выделяется, сколько выживает после сборки мусора и т.д.

0
ответ дан 5 December 2019 в 10:39
поделиться

Сборка мусора Потоки различаются в зависимости от того, на какой системе вы настроили их работу. На простой рабочей станции каждый отдельный поток будет размещать сборку мусора, но одновременно может быть размещен только один. Если он настроен для работы на сервере, сборка мусора будет размещаться в отдельном потоке.

http://msdn.microsoft.com/en-us/library/ee787088.aspx#generations

Но, возможно, ваши объекты остаются слишком долго и переходят в поколение Long-Life, а сборка мусора - нет. смотрите на них сколько угодно раз.

Или, возможно, у вас есть другая проблема.

0
ответ дан 5 December 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: