关于外部流程的GC

cra*_*ice 2 .net garbage-collection perfview

是否可以在外部进程上强制GC?我的意思是没有附加到Visual Studio/windbg等我知道可能有可能用VS立即窗口这样的东西.

编辑在此输入图像描述 看起来这可以通过PerfView完成,但我可以找到很多信息,好像这是一个完整的GC或什么.有任何想法吗?

小智 10

您从外部进程强制GC的选项是

1)附加调试器API并使用该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性能架构师.


Sco*_*ain 2

不,Windows 和 .NET 都没有公开任何类型的 API,您可以使用该 API 在外部进程上强制执行 GC,而无需附加调试器。

您必须附加调试器并使用该路由来强制执行 GC。