Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当仍有可用内存时,线程启动时发生OutOfMemory异常_C#_Multithreading_Out Of Memory - Fatal编程技术网

C# 当仍有可用内存时,线程启动时发生OutOfMemory异常

C# 当仍有可用内存时,线程启动时发生OutOfMemory异常,c#,multithreading,out-of-memory,C#,Multithreading,Out Of Memory,我有在循环中生成线程的代码。在大约一千个线程之后,我在thread.Start()调用中得到了OutOfMemoryException 显然,de C#app中没有内存,而我的应用程序只分配了约87MB的内存(根据任务管理器) 为什么我要从内存中获取OutOfMemoryexception?我不知道任务管理器提供了多少个任务,但每个线程都会消耗1 MB的保留(尚未提交)虚拟内存,因此1000个小恶魔需要1 GB的保留虚拟机。如果这是一个玩具程序,那没关系,但是如果你真的想用数千个线程来解决一个问

我有在循环中生成线程的代码。在大约一千个线程之后,我在
thread.Start()
调用中得到了
OutOfMemoryException

显然,de C#app中没有内存,而我的应用程序只分配了约87MB的内存(根据任务管理器)


为什么我要从内存中获取
OutOfMemory
exception?

我不知道任务管理器提供了多少个任务,但每个线程都会消耗1 MB的保留(尚未提交)虚拟内存,因此1000个小恶魔需要1 GB的保留虚拟机。如果这是一个玩具程序,那没关系,但是如果你真的想用数千个线程来解决一个问题,那么最好开始考虑一些扩展性更好的东西(比如
任务
s)。因为每个线程都有1MB的堆栈,你可能会耗尽原始线程的内存,如果线程中有变量,那么这些线程实际上在做什么?如果不是,那么是的,这是一个玩具程序,因为不执行任何操作的线程将是最好的情况,而不是最坏的情况。事实上,如果所有线程都在执行工作,那么大多数程序都会因为远远少于1000个线程而崩溃。(如果大多数线程处于空闲状态,那就另当别论了。)测试您的程序可以承载多少线程是错误的测试——这意味着您将依赖于线程扩展。他们没有。(是的,我意识到这实际上并没有直接回答你的问题。)@kennyzx:32位进程如果不知道大地址,可以消耗高达2GB的空间,如果不知道大地址,可以消耗全部4GB的空间(如果我没弄错的话,.NET设置LAA)。64位进程没有这样的限制。有些版本的VS和.NET默认设置了“以32位运行”标志,有些则不设置。由于程序的地址空间不足,您获得了OOM。任务管理器向您展示的内容并不有用,在按需分页虚拟内存操作系统上,内存使用有多种度量方法。您还没有完成足够的请求和分页。提交大小是衡量地址空间使用情况的更好方法。使用“项目>属性>编译”选项卡,取消选中“首选32位”。当你认为成千上万的线程可以使你的程序更好时,你并不喜欢它。它将地址空间从2GB增加到8TB或更多,您首先会耗尽提交空间。