【问题标题】:Why does unmanaged code increments memory to a specific limit?为什么非托管代码会将内存增加到特定限制?
【发布时间】:2013-02-28 10:37:40
【问题描述】:

我使用一个用 .NET 编写的流控制系统,该系统通过 TCP 连接与外部系统交互,并在不同端点之间路由事务。

我的问题:

在启动/初始化时,私有工作集内存级别约为 25000KB。在系统处于空闲状态时初始化后,私有工作集以大约每秒 50-100KB 的速度递增,直到达到大约 57000KB 的限制。

信息:

系统在增量期间产生页面错误。

当达到限制时,当我连接+300个客户端并交换几个小时的高频事务时,私有工作集保持非常稳定并上下震荡几MB,垃圾收集的逻辑非常有效嗯。

我已经使用 Redgate 的一个名为“Memory Profiler”的工具对这个系统进行了分析,它告诉我在初始化后内存增加是由非托管代码分配的,不幸的是,这个分析器不支持洞察非托管代码分配的内存,所以我遇到了困难找出这个分配的内存包含什么,为什么分配它以及分配内存的代码。

整个代码库是用 C# 开发的,没有对 COM+ 程序集的引用,也没有与本机 Windows API 的通信(在此内存的增量期间)。

我的问题:

我需要指出正确的方向,以找出为什么内存在初始化后以小块连续递增到特定级别。

【问题讨论】:

  • “通过 TCP 连接 [...] 与本地 Windows API 没有通信。” - 你在使用 WinSock 时重建了它? ;-)
  • 在此内存的增量期间没有与本机 API 的通信,(我的问题现在已使用该信息进行了编辑)。
  • @Tobias 你可能想试试.Net Memory Profiler。它可以跟踪非托管内存,并且有免费试用版。
  • @Dzienny 谢谢!我将测试这个分析器,该死的 Redgate 不支持非托管代码的透明度,我的雇主刚刚购买了他们的整个软件套件。

标签: c# memory-management garbage-collection unmanaged


【解决方案1】:

如果页面不在工作集中,这并不意味着该页面仅存储在磁盘上或根本存储在磁盘上。 Windows 上的页面可以进入备用列表。如果他们这样做了,他们就会离开 WS 并要求 软故障 将他们带回来。 (我从来不明白为什么会有这种机制,但确实如此)。软故障很便宜。

使用 Process Explorer 的系统信息窗口,您可以查看每秒硬故障和软故障的数量。可能也可以使用 perfmon。我建议你检查你是否有硬故障(我相信你没有,所以你没有问题,你可以结束调查)。

另外,WS 与内存使用无关,但我想你已经知道了。

【讨论】:

  • 感谢您的信息,生成的页面错误是软错误。
  • @Tobias 你很好。这不是性能问题,而是 Windows 上通常神秘的内存管理器决策的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
相关资源
最近更新 更多