【问题标题】:Run garbage collector from command line? [closed]从命令行运行垃圾收集器? [关闭]
【发布时间】:2011-04-05 09:02:40
【问题描述】:

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

编辑:

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

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

因此,如果有办法在 JVM 中执行此操作,请看不出它在 .NET 中不存在的原因

【问题讨论】:

  • 从哪里收集垃圾?
  • 来自某个进程。我想强制 GC 进行一些诊断。这不是我的代码的一部分。
  • 无用的答案:在 PowerShell 内部运行 [gc]::Collect(0) 以在进程中运行第 0 代集合。但是为什么要这样做呢?
  • @Richard:我认为可能有一些工具可以为某些特定进程(比如通过 ID)调用 GC。像 toolname.exe /GC /pid:1234。感谢 Darin Dimitrov,我知道没有这样的工具。但它可能是,所以我问这个问题是肯定的。而且我仍然认为这是一个法律问题,不明白你为什么投反对票?

标签: .net command-line garbage-collection


【解决方案1】:

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

你可以使用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 版本。对我有用,但可能不是包罗万象。

【讨论】:

  • 太棒了!非常感谢
  • 尝试在 ASP.NET 中执行此操作会导致“System.UnauthorizedAccessException:访问被拒绝”。在ICLRProfiling.AttachProfiler
  • @DannyMeister 确保您拥有相应的权限(运行 perfview.exe 的用户与运行 IIS 的用户)。
【解决方案2】:

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

还要注意强制垃圾回收(使用GC.Collect)方法是considered as bad practice,应该避免。


没有 Microsoft 工具,而且我从未听说有任何第三方工具能够做到这一点。每个进程都有自己的 GC 堆,因此也有自己的 GC 线程,因此不可能在另一个进程(AFAIK)上强制执行 GC 收集。

【讨论】:

  • 谢谢,但正如我在问题中所问的那样:“无需编写代码”。我假设有任何工具,我可以从命令行调用某些特定过程。很抱歉,您的回答不相关。
  • @Kamarey,没有微软工具(我怀疑是否存在任何第三方工具)。每个进程都有自己的 GC 堆,因此有自己的 GC 线程,因此据我所知,在另一个进程上强制 GC 收集是不可能的。
  • @Kamarey 说不,它不能做到并给你理由怎么不相关?
  • 好的,谢谢。那么你可以用你最后的评论替换你的答案,这样它就会回答我的问题吗?
  • 关于“没有微软工具”。显然,使用“PerfView”有可能“现在”(很可能是自 2012 年以来 ;-)。请参阅我的答案以了解更多详细信息和注意事项。
【解决方案3】:

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

【讨论】:

  • 我认为这现在在 dotMemory 中,它是前 dotTrace 的内存相关部分。当前的dotTrace是与性能相关的部分。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2011-05-14
    相关资源
    最近更新 更多