我有一个用C++实现的服务器,它在Windows2003企业上运行,内存为25GBRAM。
在一次压力测试中,我发现当它试图通过调用_beginthread来创建一个新线程时,我得到了ENOMEM,这意味着“内存不足”。
但我不明白为什么会内存不足,perfmon的数据显示,当时进程已经使用了1.2 of的VM和类似的物理内存,只有250个线程。
有人能帮助我分析或解释为什么我仍然得到这个错误吗?
发布于 2012-10-26 01:44:44
这最终是因为我们的应用程序中的内存泄漏。
发布于 2012-09-11 18:08:28
一个线程通常需要1 MB未分段的地址空间。如果您的压力测试有零碎的内存,以至于没有1MB的伸展空间可用,那么您将无法创建任何新线程。在最坏的情况下,这可以通过每个一个字节的2000个分配来实现。
发布于 2012-09-11 07:56:55
一个典型的32位应用程序会在创建少于2048个线程后耗尽(虚拟)内存。默认情况下,每个线程保留1MB的连续虚拟地址空间,因此2048个线程将需要2 2GB的虚拟内存。这是32位进程在用户模式下可以使用的最大值。
附注:有一个选项(至少在Windows上)可以配置操作系统在用户模式下保留最多3 3GB的虚拟地址空间。
https://stackoverflow.com/questions/12360845
复制相似问题