2015-03-03 7 views
1

Можно ли принудительно использовать GC для внешнего процесса? Я имею в виду без привязки к Visual Studio/windbg и т. Д. Я знаю, что возможно сделать это с помощью чего-то вроде окна VS Immediate.GC по внешнему процессу

EDITenter image description here Похоже, это может быть сделано с помощью PerfView, но я мог бы найти много информации, как будто это делает полный GC или что. Есть идеи?

+0

Почему вы даже хотите? –

+0

Что проголосовало? –

+0

Я не делал downvoting, но если вы посмотрите на текст кнопки, он говорит: «Этот вопрос не показывает никаких исследований, он неясен или не полезен». В то время, когда вы проводили нисходящий опрос, у вас не было никаких исследований, вероятно, почему это было приостановлено. –

ответ

2

Нет, ни Windows, ни .NET не предоставляют какой-либо API, который вы могли бы использовать для принудительного подключения GC к внешнему процессу без прикрепления к нему отладчика.

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

+0

@PaulSnow PerfView временно прикрепляет отладчик, заставляет GC, затем отделяет или имеет отладчик, прикрепленный все время. Что вы сказали, что не хотите делать в своем решении. –

+0

Вы правы, я, вероятно, не был ясен в своем вопросе. Я нашел некоторых людей, предлагающих установить VS и сделать GC.Collect из его непосредственных окон. Это звучит как очень тяжелое решение (требуется установить VS). Поэтому я в основном не хотел использовать этот. –

+1

Если вы хотите написать программу для этого, вам необходимо написать код для взаимодействия с [DebuggingAPI] (https://msdn.microsoft.com/en-us/library/ms809754.aspx), что не так просто (все неуправляемые COM-вызовы, я бы не сделал это в качестве вашего первого проекта взаимодействия с COM). Возможно, вам удастся избежать командной строки, которая обертывает интерфейс, такой как [MDbg] (https://msdn.microsoft.com/en-us/library/ms229861%28v=vs.110%29.aspx). Просто назовите это из своей программы и передайте команды. –

8

Ваши варианты заставляя GC от внешнего процесса

1) Присоединить отладчик с API и вызвать метод GC.Collect(), используя этот API. Я попытался сделать это с PerfView изначально, но он не работает, если процесс заблокирован в собственном коде (отладчик не присоединяется, пока он не запускает управляемый код еще раз), что было неприемлемым.

2) Внесите профайлер (который с V4.5 вы можете сделать с приложением) и вызовите API для этого, чтобы сделать GC. Это работает (при условии, что другой профилировщик еще не подключен). Это действительно то, что делает PerfView.

3) Используйте отслеживание событий для Windows (ETW). Начиная с V4.5 среды выполнения, существует ключевое слово GCHeapCollect, которое, если установлено, заставит среду выполнения выполнить полный GC. Для включения ETW-провайдеров вам необходимо быть администратором, поэтому это работает, только если вы контролируете процесс, может быть администратором. Если вы хотите сделать это, используя пакет TraceEvent Nuget (см. http://blogs.msdn.com/b/vancem/archive/2014/03/15/walk-through-getting-started-with-etw-traceevent-nuget-samples-package.aspx) Обычно ETW отправляет запрос ко всем процессам в системе, но вы можете сделать его специфичным для процесса (на Win 8 или новее) с помощью TraceEventProviderOptions.

Обратите внимание, что все это не предназначено для случайного использования. Вы должны быть чем-то вроде отладчика или профилировщика, чтобы делать такие вещи. Принудительные GC в других процессах без их участия, как правило, зла ....

Vance Morrison .NET Performance Architect.

+0

Спасибо Vance за очень полезные советы –