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

.net 从命令行运行垃圾收集器?,.net,command-line,garbage-collection,.net,Command Line,Garbage Collection,是否可以从命令行运行.NET垃圾收集器(例如,不编写代码) 编辑: 当被问到这个问题时,我的意思正是Java垃圾收集器的问题: 因此,如果有一种方法可以在JVM中实现这一点,那么就没有理由认为它不存在于.NET中,垃圾收集器在进程中运行。因此,如果要为此进程运行垃圾收集器,可以尝试以下方法。不能从外部强制对给定进程进行垃圾收集 还要注意,强制垃圾收集(使用GC.Collect)方法是并且应该避免的 没有微软的工具,我从来没有听说过任何第三方的工具能够做到这一点。每个进程都有自己的GC堆,因此

是否可以从命令行运行.NET垃圾收集器(例如,不编写代码)

编辑:

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


因此,如果有一种方法可以在JVM中实现这一点,那么就没有理由认为它不存在于.NET中,垃圾收集器在进程中运行。因此,如果要为此进程运行垃圾收集器,可以尝试以下方法。不能从外部强制对给定进程进行垃圾收集

还要注意,强制垃圾收集(使用
GC.Collect
)方法是并且应该避免的



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

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


JetBrains dotTrace允许您在连接到进程并捕获其跟踪时调用垃圾收集。所以有一种方法。。。
有一个选择,尽管我不知道这是否是“安全生产”。也就是说,我不知道目标进程崩溃的风险有多高。但如果用于故障排除和/或分析,它可能会派上用场

您可以出于以下目的使用:

PerfView.exe ForceGC [ProcessName | Process ID]
或者引用
PerfView.exe/?
输出:

。。。 用法:PerfView ForceGC进程

强制指定进程上的GC

参数: Process要强制执行的进程的进程ID或进程名称(不带扩展名的Exe) GC。

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

但是,PerfView.exe将大量可执行文件转储到
%APPDATA%\PerfView\\u version\
,这些文件作为资源打包在PerfView.exe可执行文件中

因此,一旦运行PerfView.exe命令,就可以手动调用
HeapDump.exe
工具(在我的例子中,在x64框上,进程ID为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]
请注意,以上内容可能不是该工具的正式使用,可能会停止使用新版本。当然,PerfView可以做的不仅仅是强制GC(启动)

在内部,上面使用了CLR随附的评测接口/方法。因此,为此目的编写“更简单”/“独立”工具并非完全不可能。非琐碎的任务永远不会少

更新:PerfView现在就是这样,上面讨论的工具。如果您好奇的话


更新:我使用上述技术推出了这个版本。对我来说是可行的,但可能并不全面。

从何处收集垃圾?从某些进程。我想强制GC进行一些诊断。这不是我代码的一部分。无用的回答:在PowerShell内部运行
[GC]::collect(0)
在流程中运行gen 0集合。但是为什么要这样做呢?@Richard:我假设可能有某种工具可以为某个特定流程调用GC(比如通过ID)。比如toolname.exe/GC/pid:1234。多亏了Darin Dimitrov,我知道没有这样的工具。但它可能是,所以我问了这个问题以确定。我仍然认为这是一个法律问题,不明白你为什么否决它?谢谢,但正如我在问题中问的:“不写代码”。我假设有任何工具,我可以从命令行调用,用于某些特定过程。很抱歉,您的回答与此无关。@Kamarey,没有Microsoft工具(我怀疑是否存在任何第三方工具)。每个进程都有自己的GC堆,因此也有自己的GC线程,所以就我所知,在另一个进程上强制执行GC收集是不可能的。@Kamarey为什么不相关?声明不可以,并给出原因?好的,谢谢。那么你能用最后一条评论替换你的答案吗,这样它就能回答我的问题?关于“没有Microsoft工具”。显然,现在(很可能从2012年开始;-)使用“PerfView”是可能的。有关更多详细信息,请参阅我的答案和注意事项。令人惊讶的是,在ASP.NET中大量尝试这样做会导致“System.UnauthorizedAccessException:访问被拒绝”。“在
ICLRProfiling.AttachProfiler
@DannyMeister中,请确保您具有执行此操作的适当权限(运行perfview.exe的用户与运行IIS的用户)。我认为这现在位于dotMemory中,它是前一个dotTrace中与内存相关的部分。当前的dotTrace是与性能相关的部分。
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]