繁体   English   中英

GetGCMemoryInfo().GCGenerationInfo.SizeAfterBytes 报告的神秘非常大(错误)的数字

[英]Mysterious very large (wrong) number reported by GetGCMemoryInfo().GCGenerationInfo.SizeAfterBytes

以前我使用 PerfCounter 检查堆,但在移动到 .NET5+ 后它们似乎不再可用。

现在,我尝试使用 GetGCMemoryInfo API,代码如下:

 var info = GC.GetGCMemoryInfo();
 var index = info.Index;

 var genInfos = info.GenerationInfo;
            
 var genInfo = genInfos[0]; // and 1, 2, 3 (Loh)
 var delta = genInfo.sizeAfterGc - genInfo.sizeBeforeGc;
 
 // Write Log: sizeAfterGc (delta) (#index)

我的应用程序在任务管理器中曾经报告 ~1.5G memory 使用情况。 但是 sizeAfterGc 给了我一些非常大的数字,我认为这是错误的。

我的应用程序中的一些示例 output:

Gen 0 Heap Size: 4950350920 (-2591581216) (#870)
Gen 1 Heap Size: 3273780000 (+4675848) (#870)
Gen 2 Heap Size: 503084649368 (+833581192) (#870)

其中表示 5GB Gen0、3GB Gen1 和 500GB Gen2。

现在,如果我让我的应用程序运行足够长的时间,我可以看到所有世代的数量都在不断增加。

例如,

Around Start of App: 
Gen 0 Heap Size: 63270464 (-574326464) (#96)

~20-mins later:
Gen 0 Heap Size: 12494958280 (-2876572192) (#1787)

~2-hrs later:
Gen 0 Heap Size: 108851806072 (-6817850448) (#13303)

除了 maoni 的博文,我找不到太多关于如何使用/协调这个 api 的信息。

我不太确定GC.GetGCMemoryInfo(); 应该这样称呼? 我猜这报告了最新的 GC(任何类型),并且附加到此 GC 运行的 GenerationInfo 应该仍然与在给定时间检查所有堆有关?

IE。 如果这给出了 GCMemoryInfo #870,那么我应该期望 GenerationInfo 代表执行 #870 后的堆状态?

想请教有这方面经验的朋友,万分感谢!

(我在 .NET6 上测试这个)

此 API 中存在一个错误,已在 Maoni0 对 GCMemoryInfo 中生成信息的 PR 修复中修复 · 拉取请求 #60309 · do.net/runtime - 生成信息在 GC 后未归零,因此它始终在增加。

它是在 .NET 6 发布时发现的,但正如我们在 PR 中看到的那样,它将很快被反向移植到 .NET 6。

要跟踪生成大小和其他与 GC 相关的指标,您可以改用EventCounters ,进程内或进程外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM