从外部触发.NET垃圾收集

时间:2020-03-06 14:25:34  来源:igfitidea点击:

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

有一些托管调试助手会在我们跨本机/托管边界移动时强制进行收集,并且AQTime似乎具有建议这样做的按钮,但我找不到有关如何执行此操作的任何文档。

解决方案

如果通过远程处理公开一个函数/对象,那么可以很容易地做到这一点。

好吧...有直接的窗口。如果我们可以奢侈地添加到该进程,那么我想我们可以在立即窗口中手动进行GC.Collect。

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

如果在Visual Studio中,John Cocktoastan回答使用GC.Collect是最好的选择。

我仍然找不到在WinDBG下实际进行收集的替代方法,而是退回到"可回收多少内存?"的问题。 (请参阅我对John的回答的评论)我认为还有一种替代方法,即通过!DumpHeap和!GCRoot的某种组合使用脚本化(PowerDBG?)搜索来找到非根目录句柄并总计使用的空间(基本上模拟该算法GC将使用调试器进行操作)。但是,考虑到这一点,我还没有遇到这些错误之一,因此也没有尝试编写代码来做到这一点。