.NET中的堆栈溢出将IIS发送到100%的CPU使用率 - 为什么没有StackOverflowException?

Jak*_*les 15 asp.net stack-overflow iis

我在Server 2008 R2 + IIS 7.5上运行的ASP.NET应用程序中有一些代码.每当我加载一个特定的页面时,它将永远挂起并将IIS发送到100%的CPU使用率.我最终追查了这个问题.

public string Comments
{
    get { return this.Comments; }
}
Run Code Online (Sandbox Code Playgroud)

哎呀 - 本来应该的return this.Photo.Comments.所以,我的问题是,为什么.NET没有生成StackOverflowException,而是让IIS以100%的CPU运行的时间远远超过应该的时间.根据我使用.NET编程的经验,在执行上述操作时,需要几秒或更短时间才能获得StackOverflowException.那么它怎么能在IIS上运行近30分钟呢?

Kev*_*Kev 5

JIT编译器可能优化了一个方法调用YourClass::get_Comments()(这就是IL的样子)并用一个jmp(或者x86汇编程序将是)循环构造内联代码,因为没有传递任何值.只是一个想法.

这篇旧文章值得一看:

Jit优化:内联(II)

"一个非常好的内联候选者的典型例子是属性getter/setter.这些通常是非常小的方法,通常只是进行内存提取或存储,因此通常需要大小和速度来内联它们."

原样:

编写高性能托管应用程序:入门 - 托管代码和CLR JIT

我还用简单的控制台应用程序重现了这个:

class Program
{
  static void Main(string[] args)
  {
    MyClass mc = new MyClass();
    string s = mc.Comments;
  }
}

public class MyClass
{
  public string  Comments
  {
    get { return this.Comments; }
  }
}
Run Code Online (Sandbox Code Playgroud)

在优化关闭的调试模式下,我得到一个堆栈溢出异常.在启用Jit Optimisations并编译发布版本后,该应用程序将永远运行.这表明可能发生了内联循环.

这似乎也是C#2.0,3.0和4.0的情况.