在远程 CLR 进程中强制进行垃圾回收

Posted

技术标签:

【中文标题】在远程 CLR 进程中强制进行垃圾回收【英文标题】:Force garbage collection in remote CLR process 【发布时间】:2016-02-15 16:13:39 【问题描述】:

我有一个基于 CLRMD 库的简单自定义内存分析器。它工作正常。但是我必须始终从目标应用程序内部手动强制 GC 以获得准确的对象计数。有没有一种简单的方法可以从另一个进程触发我机器上的 CLR 进程的 GC? 我的第一个想法是使用某种远程处理来告诉目标进程执行 GC。但这需要修改目标,这不是一个好主意。

【问题讨论】:

我不知道为什么这被否决了。商业内存分析器在拍摄快照之前运行强制 GC,但如何?我也在寻找解决方案。如果你找到了请发帖。谢谢。 【参考方案1】:

如果目标应用程序是您的,您可以使用自定义 CLR 主机运行它,实现 ICLRGCManager,并从托管代码的“外部”调用其 Collect 方法。

您仍然需要某种遥控器或触发器来执行此操作, 但是你可以导出一个 C 风格的过程来调用它,并从你的分析器中导出 GetProcAddress,完全绕过托管控制(我从未在 C# 中尝试过,只是在 Delphi 中,但它应该可以工作) .

请参阅http://community.bartdesmet.net/blogs/bart/archive/2005/07/24/2984.aspx 了解一些漂亮的解释(感谢 Bart De Smet)。

【讨论】:

以上是关于在远程 CLR 进程中强制进行垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么对一个对象强制垃圾回收

一文带你吃透CLR垃圾回收机制

重温CLR(十五) 托管堆和垃圾回收

从外部触发 .NET 垃圾回收

垃圾回收机制

浅析CLR的GC(垃圾回收器)