从外部触发.NET垃圾回收

从外部触发.NET垃圾回收,.net,debugging,garbage-collection,windbg,.net,Debugging,Garbage Collection,Windbg,有没有办法从另一个进程或WinDBG内部触发.NET进程中的垃圾收集 有一些托管调试助手可以在您跨越本机/托管边界时强制收集,并且似乎有一个按钮建议它这样做,但我找不到任何关于如何这样做的文档。如果您通过远程处理公开一个函数/对象,这可以很容易地完成。好吧。。。这是直接窗口。如果您有附加到进程的特权,我想您可以在即时窗口中手动GC.Collect 更大的问题:为什么要手动诱导GC.Collect?这是一个令人讨厌的习惯,表明存在更大的设计问题。John Cocktoastan关于使用GC的回答。

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


有一些托管调试助手可以在您跨越本机/托管边界时强制收集,并且似乎有一个按钮建议它这样做,但我找不到任何关于如何这样做的文档。

如果您通过远程处理公开一个函数/对象,这可以很容易地完成。

好吧。。。这是直接窗口。如果您有附加到进程的特权,我想您可以在即时窗口中手动GC.Collect


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

John Cocktoastan关于使用GC的回答。如果有,在Visual Studio中收集是最好的选择

我仍然找不到一个替代方法来实际执行WinDBG下的收集,但退一步,回到“有多少内存是可回收的?”(请参阅我对John答案的评论)我认为有一个替代方法,通过使用脚本(?)搜索,通过以下方式组合!垃圾堆和垃圾堆!GCRoot查找非根句柄并计算所用的总空间(基本上模拟GC使用调试器执行的算法)。但考虑到这一点,我还没有遇到过这样的错误,所以我也没有尝试编写代码来实现它。

回答如下:

基本上,使用:


它不适合生产使用。

我感兴趣的应用程序目前不支持远程处理,因此不可能仅为此添加远程处理。为什么单个公开的远程处理对象不可行?你只需要不到20行就可以做到。这里有一个小例子:因为它是一个纯C++应用程序,只通过COM访问.NET,而有很多C保证的访问量,在这里你可以钩住这个小得多。也有非技术性的原因。这不是我想经常做的习惯性的事情:-)。我们偶尔会遇到内存使用问题;当这些情况发生时,GC将频繁收集。在调查时,出于速度原因,最好使用精简的数据集,但这些数据集不会以相同的方式强调GC。。。[续…]在较小的集合上,偶尔有用的信息的一个方面是GC可能回收的内存使用比例。如果它只是一个特定的点,那么您可以调整代码以强制执行,但偶尔更多的特殊方法会很方便。我同意,我使用GC.Collect来实现这一目的,通常是在观看perfmon时查看“我能得到什么”。很好,你似乎站在GC辩论的右边:)最新版本2.0.7的可能副本也需要打开
/AcceptEula
开关。
PerfView.exe ForceGC [ProcessName | Process ID] /AcceptEULA