从命令行运行垃圾收集器?

时间:2010-08-29 08:27:47

标签: .net command-line garbage-collection

是否可以从命令行运行.NET垃圾收集器,例如没有编写代码?

编辑:

当被问到这个问题时,我的意思就是这里要求Java垃圾收集器:

How to request JVM garbage collection (not from code) when run from Windows command-line

因此,如果有一种方法可以在JVM中执行此操作,请查看它在.NET中不存在的原因

4 个答案:

答案 0 :(得分:25)

有一个选项,虽然我不知道这是否“生产安全”。也就是说,我不知道风险有多高,目标进程崩溃了。但如果用于故障排除和/或分析,它可能会派上用场。

您可以将PerfView用于此目的:

PerfView.exe ForceGC [ProcessName | Process ID]

或引用PerfView.exe /?输出:

  

...   用法:PerfView ForceGC流程

     

强制指定进程的GC

     

参数:       进程强制进程的进程ID或进程名称(Exe无扩展名)                                            一个GC。   ...

这里的“问题”是,这将打开一个新的控制台窗口,完成后会提示您关闭此窗口。

然而,PerfView.exe会将大量可执行文件转储到%APPDATA%\PerfView\_version_,这些可执行文件作为资源打包在PerfView.exe可执行文件中。

因此,一旦运行了PerfView.exe命令,就可以手动调用HeapDump.exe工具(在我的情况下在x64框中,并使用进程ID 15396):

cd C:\Users\MyUserName\AppData\Roaming\PerfView\VER.2014-02-04.09.06.52.000\AMD64
HeapDump.exe /ForceGC 15396

示例输出如下:

Loading the ETWClrProfiler.
Turning on debug privilege.
Highest Runtime in process is version v4.0.30319
  0,0s: Trying to attach a profiler.
  0,1s: Done Attaching ETLClrProfiler ret = 0
Attached ETWClrProfiler.
  0,1s: Enabling JScript Heap Provider
  0,1s: Enabling EtwClrProfiler
  0,1s: Enabling CLR GC events
  0,1s: Requesting a JScript GC
  0,1s: Requesting a DotNet GC
  4,0s: .NET GC Starting at 0,15s.
  4,0s: .NET GC stats, at 0,16s Survived 2221152.
  6,0s: .NET GC complete at 0,17s.
  6,0s: Triggered .NET GC,  No JScript heap detected
  6,1s: Requesting ETWClrProfiler unload.
  6,1s: Shutting down ETW session
[  6,1s: Done forcing GCs success=True]

请注意,以上是AFAIK没有正式使用该工具,可能会停止使用新版本。当然,PerfView可以做的不仅仅是强制GC(开始here)。

在内部,上面使用了CLR附带的ICorProfilerInfo::ForceGC分析界面/方法(source。因此,为此目的编写一个“更简单”/“独立”的工具并不完全不在问题。非平凡的任务永远不会少。

更新:PerfView现在是open source,上面讨论的工具is part of it。如果你很好奇。

答案 1 :(得分:10)

垃圾收集器在进程内运行。因此,如果要为此过程运行垃圾收集器,可以尝试使用GC.Collect方法。您不能从外部强制执行给定进程的垃圾收集。

另请注意,强制垃圾回收(使用GC.Collect)方法为considered as bad practice,应避免使用。


没有Microsoft工具,我从未听说过任何第三方工具能够做到这一点。每个进程都有自己的GC堆,因此它自己的GC线程,因此在另一个进程AFAIK上强制GC Collection是不可能的。

答案 2 :(得分:3)

JetBrains dotTrace允许您在附加到进程并捕获其跟踪时调用垃圾回收。所以有一种方法...... http://www.jetbrains.com/profiler/

答案 3 :(得分:2)

此工具允许您强制进行垃圾收集..它必须在您要使用的进程之前启动 - 因此它不是您想要的。

http://www.yourkit.com/dotnet/download/index.jsp

http://www.yourkit.com/docs/index.jsp