1

我有一台用 C++ 实现的服务器,运行在具有 25GB RAM 的 Windows 2003 企业上。

在压力测试期间,我看到当它试图通过调用 _beginthread 创建一个新线程时,我得到了 ENOMEM,这意味着“内存不足”。

但是不明白为什么是内存不足,perfmon数据显示当时进程已经使用了1.2GB VM和类似的物理内存,只有250个线程。

谁能帮我分析或解释为什么我仍然得到这个错误?

4

3 回答 3

2

一个线程通常需要 1 MB 的未分段地址空间。如果您的压力测试将内存碎片化到没有可用的 1 MB 延伸的程度,您将无法创建任何新线程。在最坏的情况下,这可以通过少至 2000 个每个字节的分配来实现。

于 2012-09-11T10:08:28.083 回答
0

一个典型的 32 位应用程序在创建少于 2048 个线程后会耗尽(虚拟)内存。默认情况下,每个线程保留 1MB 的连续虚拟地址空间,因此 2048 个线程将需要 2GB 的虚拟内存。这是 32 位进程在用户模式下可能消耗的最大值。

PS 有一个选项(至少在 Windows 上)可以将操作系统配置为在用户模式下保留多达 3GB 的虚拟地址空间。

于 2012-09-10T23:56:55.273 回答
0

它最终是因为我们的应用程序中的内存泄漏。

于 2012-10-25T17:44:44.480 回答