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分钟呢?
JIT编译器可能优化了一个方法调用YourClass::get_Comments()(这就是IL的样子)并用一个jmp(或者x86汇编程序将是)循环构造内联代码,因为没有传递任何值.只是一个想法.
这篇旧文章值得一看:
"一个非常好的内联候选者的典型例子是属性getter/setter.这些通常是非常小的方法,通常只是进行内存提取或存储,因此通常需要大小和速度来内联它们."
原样:
我还用简单的控制台应用程序重现了这个:
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的情况.
| 归档时间: |
|
| 查看次数: |
2077 次 |
| 最近记录: |