Dot-Net

從命令行執行垃圾收集器?

  • January 11, 2021

是否可以從命令行執行 .NET 垃圾收集器,例如無需編寫程式碼?

編輯:

當被問到這個問題時,我的意思正是這裡對 Java 垃圾收集器的要求:

從 Windows 命令行執行時如何請求 JVM 垃圾收集(不是來自程式碼)

因此,如果有辦法在 JVM 中執行此操作,請看不出它在 .NET 中不存在的原因

有一個選項,雖然我不知道這是否是“生產安全”。也就是說,我不知道目標程序崩潰的風險有多高。但如果用於故障排除和/或分析,它可能會派上用場。

您可以將PerfView用於以下目的:

PerfView.exe ForceGC [ProcessName | Process ID]

或者從PerfView.exe /?輸出中引用:

… 用法:PerfView ForceGC 程序

強制對指定程序進行 GC

參數: Process 強制 GC 的程序的程序 ID 或程序名稱(Exe 沒有副檔名)。…

這裡的“問題”是,這將打開一個新的控制台視窗,並在完成後提示您關閉此視窗。

然而,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(從這裡開始)。

在內部,上面使用CLR 附帶的ICorProfilerInfo::ForceGC分析介面/方法(來源。為此目的編寫“更簡單”/“獨立”工具並非完全不可能。非平凡的任務永遠不會少.

更新: PerfView 現在是開源的,上面提到的工具也是其中的一部分。以防你好奇。

更新:我使用上述技術推出了自己的版本。對我有用,但可能不是包羅萬象。

引用自:https://stackoverflow.com/questions/3594069