寻找垃圾收集根[关闭]

Posted

技术标签:

【中文标题】寻找垃圾收集根[关闭]【英文标题】:Finding garbage collection roots [closed] 【发布时间】:2016-08-19 21:55:49 【问题描述】:

.NET 中是否有提供类似 WinDBG-SOS 功能的 API?

给定一个对象,我想知道有多少根在运行时通过 C# 在同一进程中保持其活动状态。

【问题讨论】:

我不确定在运行时级别上是否可行。优化后的代码可以跳过堆栈直接进入 CPU。所以我想知道你希望从这个 API 得到什么输出? 无 API。您需要一个内存分析器,其中有几个。您最喜欢的网络搜索引擎可以为您提供帮助。 @Sergey.quixoticaxis.Ivanov 基本上你可以用 WinDBG 实现什么;找到内存中的对象及其根。 @Uno 我想指出这样一个事实,即恕我直言,如果将其添加到运行时 API,那就太奇怪了,因为它是一个仅针对调试构建提供合理信息的 API。 【参考方案1】:

ClrMD

NuGet:https://www.nuget.org/packages/Microsoft.Diagnostics.Runtime

我还写了一个小例子:

https://github.com/UnoSD/ClrMdExample

【讨论】:

【参考方案2】:

是的,有。如果没有,所有这些配置文件将如何工作?这称为 Profiling API:https://msdn.microsoft.com/en-us/library/ms404386(v=vs.110).aspx。

API 本身是非托管的(COM 对象)。但是没有什么可以阻止您通过 RCW 从托管代码中使用它。

我不确定您是否可以从内部剖析流程。我认为探查器必须在另一个进程中。虽然我认为进程处理通信并通过命名管道等通信方法将数据反馈回分析进程没有问题。

【讨论】:

谢谢,我稍后看看文档;你也有一些例子的链接吗? 抱歉,我可能错了能够编写托管分析器 :( ***.com/questions/5736845/… 你可以在那篇文章中找到有趣的博客参考 深入挖掘我发现了更多有趣的东西:topholt.com/c-clr-profilerresearch.microsoft.com/en-us/um/redmond/projects/pex/wiki/… 这看起来是您任务的一个很好的起点:***.com/questions/3898078/…

以上是关于寻找垃圾收集根[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

java 垃圾收集

G1 GC垃圾收集流程

不说吴亦凡,谈谈垃圾收集器

不说吴亦凡,谈谈垃圾收集器

JVM垃圾收集算法(标记-清除复制标记-整理)

学习垃圾收集理论[关闭]