[英]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.