有一个选项,虽然我不知道这是否是“生产安全”。也就是说,我不知道目标进程崩溃的风险有多高。但如果用于故障排除和/或分析,它可能会派上用场。
你可以使用PerfView来达到目的:
PerfView.exe ForceGC [ProcessName | Process ID]
或者引用PerfView.exe /?的输出:
...
用法:PerfView ForceGC 进程
强制对指定进程进行 GC
参数:
Process 要强制执行的进程的进程 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。以防你好奇。
更新:我使用上述技术推出了my own 版本。对我有用,但可能不是包罗万象。