从外部触发.NET垃圾回收

Ian*_*n G 19 .net debugging garbage-collection windbg

有没有办法从另一个进程或WinDBG内部触发.NET进程中的垃圾回收?

有一些托管调试助手在您跨越本机/托管边界时强制收集,而AQTime似乎有一个按钮,建议它执行此操作,但我找不到任何有关如何执行此操作的文档.

Dav*_*ill 11

嗯......就在眼前.如果你有附加到过程的奢侈,我想你可以在即时窗口中手动GC.Collect.

更大的问题:为什么要手动诱导GC.Collect?这是一个讨厌的习惯,并表明更大的设计问题.


Eri*_*dil 11

另一个问题中回答:

基本上,使用PerfView:

PerfView.exe ForceGC [ProcessName | Process ID] /AcceptEULA
Run Code Online (Sandbox Code Playgroud)

它不适合生产使用.


Ian*_*n G 3

John Cocktoastan 在 Visual Studio 中使用 GC.Collect 的答案是最好的选择(如果有的话)。

我仍然找不到在 WinDBG 下实际进行收集的替代方法,但退一步讨论“有多少内存可回收?”的问题。(请参阅我对约翰的回答的评论)我认为还有一种替代方法,即通过 !DumpHeap 和 !GCRoot 的某种组合使用脚本化(PowerDBG?)搜索来查找非根句柄并计算所用空间的总和(基本上模拟以下算法) GC 将使用调试器来完成)。但自从想到这一点以来,我还没有遇到过这些错误,所以没有尝试编写代码来做到这一点。