【发布时间】: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