Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# NET framework如何为OutOfMemoryException分配内存? 在C++中,实际上可以在没有分配内存的情况下按值抛出异常,所以这种情况是有意义的。但是在.NET framework中,OutOfMemoryException是一个引用类型,因此它是在堆上分配的。 当没有足够的内存来创建新对象时,.NET framework如何为OutOfMemoryException分配内存?_C#_.net_Out Of Memory - Fatal编程技术网

C# NET framework如何为OutOfMemoryException分配内存? 在C++中,实际上可以在没有分配内存的情况下按值抛出异常,所以这种情况是有意义的。但是在.NET framework中,OutOfMemoryException是一个引用类型,因此它是在堆上分配的。 当没有足够的内存来创建新对象时,.NET framework如何为OutOfMemoryException分配内存?

C# NET framework如何为OutOfMemoryException分配内存? 在C++中,实际上可以在没有分配内存的情况下按值抛出异常,所以这种情况是有意义的。但是在.NET framework中,OutOfMemoryException是一个引用类型,因此它是在堆上分配的。 当没有足够的内存来创建新对象时,.NET framework如何为OutOfMemoryException分配内存?,c#,.net,out-of-memory,C#,.net,Out Of Memory,它是由运行时预先分配的。如果您研究任何托管进程的堆,您将发现该异常的一个实例 以下是Hello World应用程序的预分配例外: 0:003> !dumpheap -stat -type Exception Statistics: MT Count TotalSize Class Name 735f2920 1 84 System.ExecutionEngineException 735f28dc 1

它是由运行时预先分配的。如果您研究任何托管进程的堆,您将发现该异常的一个实例

以下是Hello World应用程序的预分配例外:

0:003> !dumpheap -stat -type Exception
Statistics:
      MT    Count    TotalSize Class Name
735f2920        1           84 System.ExecutionEngineException
735f28dc        1           84 System.StackOverflowException
735f2898        1           84 System.OutOfMemoryException
735f2744        1           84 System.Exception
735f2964        2          168 System.Threading.ThreadAbortException

当在运行时内遇到内存不足情况时,它将调用。此调用在堆栈上构造对象,然后将其复制到静态分配的全局实例,然后抛出该实例

这不是托管异常,但它是C++中声明的异常。C++异常转换为托管异常,其中包含专门抛出预分配的托管OutoMeMyExExcExchange的代码,该代码最初是在./p>中分配和构造的。 注意:其中一些源文件很大,在加载语法高亮显示时可能会挂起浏览器几秒钟


Tim Schmelter在对另一个答案的评论中链接的调用站点与运行时内存不足和无法构造对象无关。

这是一个极好的问题。可能已经为这种情况保留了足够的内存。除了这里已经给出的其他答案,请记住OOM意味着无法分配您请求的块。如果您请求100Mb,而运行时能找到的最大可用块只有99Mb,那么它将失败。但是OOM异常只需要几个字节的内存。所以,分配失败并不意味着内存为零。当然,在这种情况下,运行库可能保留一些内存来覆盖自己。顺便说一下,关于C++的假设是错误的。根据编译器的不同,可以在堆上分配异常。急诊科的编译器没有,但是在普通的C++ ABI中,除了堆上没有剩余的空间外,还有一个小的预先分配的紧急缓冲区,但是调用了这个异常,但是运行时不必按照与你的代码相同的规则播放。另一个例子是,如果抛出
StackOverflowException
,您可以捕获它,但如果运行时抛出该异常,您无法捕获它(默认情况下)。CLR的许多底层机制实际上是用“C”和“C++”编写的。所以,完全有可能对象是“新的”或内存被操纵了。@hvd有什么副作用?OOM是否提供堆栈跟踪?我认为其余的信息是相当静态的?如果因为两个线程同时抛出它们而需要具有相同类型的两个异常会怎么样?