ASP.NET网站内存使用率相当高

前端之家收集整理的这篇文章主要介绍了ASP.NET网站内存使用率相当高前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个ASP.NET网站,将在约3-4天内使用约2gb的物理内存,对我来说听起来真的很糟糕。目前,我已配置IIS重新启动应用程序池进程,当它达到500mb。我想尝试跟踪问题。

当在.NET中创建一个对象的新实例时,我的印象是它不需要被释放,因为.NET垃圾收集器将为我做这个。

是这样的情况还是这可能是我遇到问题的原因之一?

解决方法

.NET将非常有效地管理垃圾回收。在实现IDisposable的类型上,调用Dispose方法是明智的,这可能不是您的问题。内存泄漏可能发生在.NET中,原因很多。这里有几个:

>您可以在Session中为每个用户缓存太多的数据。
>您在应用程序缓存或静态变量(如字典)中的应用程序级别上缓存太多的数据。
>您将Web控件(或用户控件)存储在会话或应用程序级别中。
>你将实例挂接到静态类型的事件上,或者连接到被引用的类型(因为它们存储在缓存中)。

我希望这给你一些关于在哪里看的想法。

更新:您应该观看this video关于ASP.NET调试。

更新2:
关于你对我的回答的评论如下。
CLR将收集所有托管内存,因此您将使用新创建的所有对象都将被收集。在这个意义上,对象是否实现IDisposable并不重要。然而,有许多次,您需要直接或间接使用本机资源(如文件句柄,图形句柄,数据库连接,使用本机 – 非托管内存)。 CLR不知道如何释放这些资源。因为这个.NET有终结者的概念。终结者是一个类的开发人员可以实现的虚拟方法。执行此操作时,CLR将在该类型的实例未被引用并在收集之前调用方法。 Finalizer通常包含释放这些资源的逻辑。换句话说,当类型需要本机资源时,通常会有一个终结者方法,允许类型释放这些资源。

关于CLR,故事在这里结束。 CLR没有具体处理实现IDisposable接口的对象。然而,.NET垃圾收集器本质上是不确定的。这意味着你不知道什么时候运行,如果它运行。这意味着在您的本地资源被清理之前可能需要很长时间(因为一个终结者只能在收集之后调用)。然而,对于许多资源,有必要在完成它们之后立即释放它们。例如,当您不关闭它们时,或者当您通过System.Drawing命名空间处理.NET中的GDI时,您将很快用尽数据库连接。

为此,引入了IDisposable界面。再次,CLR和垃圾收集器不看这个接口。它是类型和其用户之间的契约,允许用户直接释放对象的底层资源。在正常设计中,对象的终结器和对象的Dispose方法调用相同的私有或受保护的方法来释放这些资源。当一个类型实现IDisposable时,当你完成它时,调用它是Dispose方法,或者将对象包装在一个using语句中以允许释放本地资源是确定性的,这是明智的。

所以回来你的问题。所有管理对象将由GC收集,但本机资源不会。因此,类型可能会实现一个finalizer方法,而这些对象也通常会实现IDisposable接口。对它们的调用处理将明确地并且直接地释放这些本地资源。

我希望这是有道理的。

猜你在找的asp.Net相关文章