为什么非托管代码会将内存增加到特定的限制

本文关键字:增加 非托管代码 内存 为什么 | 更新日期: 2023-09-27 18:01:28

我的工作中有一个流控制系统。. NET中,系统通过TCP连接与外部系统交互,并在不同端点之间路由事务。

我的问题:

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

信息:

系统在递增过程中产生页面错误。

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

我用Redgate的一个叫做"内存分析器"的工具分析了这个系统,它告诉我初始化后的内存是由非托管代码分配的,不幸的是,这个分析器不支持对非托管代码分配的内存的洞察,所以我很难找出这个分配的内存包含什么,为什么它被分配,以及分配内存的代码。

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

我的问题:

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

为什么非托管代码会将内存增加到特定的限制

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

使用进程资源管理器的系统信息窗口,您可以看到每秒的硬故障和软故障的数量。可能也可以使用perfmon。我建议你检查一下你是否有硬故障(我相信你没有,所以你没有问题,你可以结束调查)。

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