.net - 追查 .NET 4.0 Induced GC 的来源

标签 .net garbage-collection profiling memory-profiling

我正在使用 PerfMonitor.exe ( http://bcl.codeplex.com/wikipage?title=PerfMonitor ) 来追踪 .NET 4.0 应用程序的一些 .NET 性能问题,该应用程序使用一些第三方库,其中一些是 native 代码。

当我运行 Perfmonitor GCTime 报告时,它会列出各个 GC 并以多种方式对其进行分类。报告中的一栏称为“原因”。一些 GC 的 Reason="Induced",而其他 GC 的 Reason="SmallAlloc"。

我假设标记为“SmallAlloc”的 GC 是由常规分配 (New Object()) 引起的,而标记为“Induced”的 GC 是由对“System.GC.Collect”的调用引起的。如果您认为我的假设不正确,请告诉我。

我试图找到调用 System.GC.Collect 的代码,但一直没有成功。使用 MSVS 2010 Professional,我在 System.GC.Collect 中设置了一个断点,并通过编写一个包含对 System.GC.Collect 的调用的简单测试函数来确保该断点有效。但是,我正在调整的应用程序不会在该断点处中断,这让我相信没有任何代码调用 System.GC.Collect。

我在想,也许有 native 代码通过直接调用 mscorwks.dll 中的 native 函数并绕过 System.GC.Collect 来引发 GC。我看到 System.GC.Collect 在 mscorwks 中的 JitHelpers.cpp 中调用了 _Collect。有没有办法在该函数中设置断点?

最佳答案

我仔细查看了 PerfMonitor.exe 的输出。我不确定每个标记为“Induced”的 GC 实际上是由 System.GC.Collect 引发的。似乎所有第 1 代 GC 都标记为 Reason="Induced",而所有第 0 代 GC 都标记为 Reason="SmallAlloc"。 Gen2 GC 被标记为 Reason="LowMemory"。

有一个用于跟踪 .NET Induced GC 的性能计数器。我监控了那个性能计数器,它在我的过程中没有显示任何诱导的 GC。所以我断定 Perfmonitor.exe 误导了我。

关于.net - 追查 .NET 4.0 Induced GC 的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6104741/

相关文章:

c# - 使用 StringBuilder Remove 方法比在循环中创建新的 StringBuilder 方法更节省内存吗?

c# - 析构函数 (c#) 中的异常?

Python cProfile : how to filter out specific calls from the profiling data?

c++ - 分析模板元程序编译时间

.net - 绑定(bind)到所选项目

c# - 如何检查文件是否以特定扩展名结尾然后将文件添加到列表?

.net - 在 Visual Studio 2017 中使用 Windows 窗体应用程序?

.net - 使用 System.Threading.Task 将工作项排队到线程池

java - 什么是软可达对象?

php - 生产分析代码