当在.NET中创建一个对象的新实例时,我的印象是它不需要被释放,因为.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接口。对它们的调用处理将明确地并且直接地释放这些本地资源。
我希望这是有道理的。