Kam*_*rey 13 .net command-line garbage-collection
是否可以从命令行运行.NET垃圾收集器,例如,无需编写代码?
编辑:
当被问到这个问题时,我的意思就是这里要求的Java垃圾收集器:
从Windows命令行运行时如何请求JVM垃圾回收(而不是代码)
因此,如果有一种方法可以在JVM中执行此操作,请查看它在.NET中不存在的原因
Chr*_*n.K 28
有一个选项,虽然我不知道这是否"生产安全".也就是说,我不知道风险有多高,目标进程崩溃了.但如果用于故障排除和/或分析,它可能会派上用场.
您可以使用PerfView:
PerfView.exe ForceGC [ProcessName | Process ID]
Run Code Online (Sandbox Code Playgroud)
或者从PerfView.exe /?输出中引用:
...用法:PerfView ForceGC流程
在指定的进程上强制执行GC
参数:Process强制GC的进程的进程ID或进程名称(Exe without extension)....
这里的"问题"是,这将打开一个新的控制台窗口,完成后,提示您关闭此窗口.
但是,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
Run Code Online (Sandbox Code Playgroud)
示例输出如下:
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]
Run Code Online (Sandbox Code Playgroud)
请注意,以上是AFAIK没有正式使用该工具,可能会停止使用新版本.当然,PerfView可以做的不仅仅是强制GC(从这里开始).
在内部,上面使用了CLR附带的ICorProfilerInfo :: ForceGC分析界面/方法(源代码.为此目的编写一个"更简单"/"独立"的工具因此并非完全不可能.非平凡的任务永远不会少. .
更新:PerfView现在是开源的,上面讨论的工具是它的一部分.如果你很好奇.
Dar*_*rov 10
垃圾收集器在进程内运行.因此,如果要为此过程运行垃圾收集器,可以尝试使用GC.Collect方法.您不能从外部强制执行给定进程的垃圾回收.
另请注意,强制垃圾收集(使用GC.Collect)方法被认为是不好的做法,应该避免.
没有Microsoft工具,我从未听说过任何第三方工具能够做到这一点.每个进程都有自己的GC堆,因此它自己的GC线程,因此强制GC收集在另一个进程AFAIK上是不可能的.