从外部触发 .NET 垃圾回收
Posted
技术标签:
【中文标题】从外部触发 .NET 垃圾回收【英文标题】:Triggering a .NET garbage collection externally 【发布时间】:2010-09-11 04:48:27 【问题描述】:有没有办法在 .NET 进程中从另一个进程或从 WinDBG 内部触发垃圾回收?
当您跨过本机/托管边界时,有托管调试助手会强制收集,AQTime 似乎有按钮建议它这样做,但我找不到任何关于如何做到这一点的文档.
【问题讨论】:
Run garbage collector from command line?的可能重复 【参考方案1】:回复于another question:
基本上,使用PerfView:
PerfView.exe ForceGC [ProcessName | Process ID] /AcceptEULA
它不适合生产使用。
【讨论】:
最新的2.0.7版本也需要/AcceptEula
开关。【参考方案2】:
嗯...有即时窗口。如果您有幸附加到该过程,我想您可以在即时窗口中手动 GC.Collect。
更大的问题:为什么要手动诱导 GC.Collect?这是一个令人讨厌的习惯,并且预示着更大的设计问题。
【讨论】:
这不是我打算经常做的事情以至于习惯性:-)。我们偶尔会遇到内存使用问题;当这些发生时,GC 将频繁收集。在调查时,出于速度原因,最好使用缩减数据集,但这些不会以同样的方式对 GC 造成压力。 ... [继续 ...] 在较小的集合上偶尔有用的信息的一个方面是 GC 可能回收的内存使用比例。如果它只是一个特定点,那么您可以调整代码以强制执行,但有时更多的临时方法会很方便。 我同意,我已经为此目的使用了 GC.Collect,通常是在观看 perfmon 时查看“我能得到什么”。很好,看来你是 GC 辩论的正确一方:)【参考方案3】:John Cocktoastan 在 Visual Studio 中使用 GC.Collect 的回答是最好的选择。
我仍然找不到在 WinDBG 下实际进行收集的替代方法,但退一步回到“可回收多少内存?”的问题。 (请参阅我对 John 的回答的评论)我认为可以通过 !DumpHeap 和 !GCRoot 的某种组合使用脚本 (PowerDBG?) 搜索来查找非根句柄并总计使用的空间(基本上模拟GC 将使用调试器执行的算法)。但是自从想到这一点后,我还没有遇到这些错误之一,因此没有尝试编写代码来做到这一点。
【讨论】:
【参考方案4】:如果您通过远程处理公开一个函数/对象,这可以很容易地完成。
【讨论】:
我感兴趣的应用程序目前不支持远程处理,仅为此添加它是不可行的。 为什么单个暴露的远程对象不可行?你可以用不到 20 行来完成。这是一个小例子:xacc.svn.sourceforge.net/viewvc/xacc/xacc/Configuration/… 因为它是本机 C++ 应用程序,只能通过 COM 访问 .net,虽然有很多 C#,但保证可以访问的数量要少得多。也有非技术原因。以上是关于从外部触发 .NET 垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章