有没有可能强制对外部进程进行垃圾回收? 我的意思是不需要附加到Visual Studio / windbg等。 我知道可以使用类似VS Immediate窗口的东西来执行此操作。
编辑:看起来可以通过PerfView完成此操作,但我无法找到太多信息,例如是否进行了完整的GC等。 有什么想法吗?
编辑:看起来可以通过PerfView完成此操作,但我无法找到太多信息,例如是否进行了完整的GC等。 有什么想法吗?
从外部进程强制进行垃圾收集的选项有:
1)使用调试器API连接并调用GC.Collect()方法。我最初尝试使用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会向系统上的所有进程发送请求,但您可以使用TraceEventProviderOptions将其定位到特定进程(在Win 8或更高版本上)。
请注意,这些选项均不适用于普通用途。你应该成为像调试器或分析器这样的角色才能进行此类操作。在没有参与的情况下强制其他进程进行GC通常是不好的……
Vance Morrison .NET性能架构师。
using (var userSession = new TraceEventSession("TriggerGC"))
{
userSession.EnableProvider(
ClrTraceEventParser.ProviderGuid,
TraceEventLevel.Verbose,
(ulong)(ClrTraceEventParser.Keywords.GCHeapCollect), new TraceEventProviderOptions
{
ProcessIDFilter = new List<int>() { <PROCESS_ID> }
});
userSession.Source.StopProcessing();
}
不,无论是Windows还是.NET都没有提供任何API可以在不附加调试器的情况下强制对外部进程进行GC。
您必须附加调试器并使用该路线来强制GC。