从外部触发 .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 垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

JVM垃圾回收机制是怎样的,何时触发YoungGC或FullGC操作

从golang的垃圾回收说起(下篇)

从golang的垃圾回收说起(下篇)

闭包与垃圾回收机制

jvm说说JVM在哪些情况下会触发垃圾回收

5、垃圾回收机制