從命令行執行垃圾收集器?
是否可以從命令行執行 .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 現在是開源的,上面提到的工具也是其中的一部分。以防你好奇。
更新:我使用上述技術推出了自己的版本。對我有用,但可能不是包羅萬象。