代码之家  ›  专栏  ›  技术社区  ›  davidsleeps

IIS应用程序池和.NET垃圾收集

  •  3
  • davidsleeps  · 技术社区  · 17 年前

    考虑具有连接池内存泄漏问题的ASP.NET应用程序(例如,连接未正确关闭)。

    回收应用程序池是否清除连接池(从而允许建立更多连接)?

    如果连接保留在内存中,直到垃圾收集器将其删除,那么在重新启动应用程序池时会发生这种情况吗(或者它们是/可以超出这个范围)?我也理解垃圾收集器可以随时清理它们,但它们是否仍在使用中,在重置或应用程序池重新启动之前无法收集?

    我正在回顾一个系统,其中的最终目标显然是纠正代码以正确地管理连接,并且我正试图对垃圾收集/应用程序池过程有更多的了解。

    2 回复  |  直到 17 年前
        1
  •  4
  •   Jesse Weigert    17 年前

    是的,回收应用程序池会终止并重新启动负责运行应用程序的IIS进程。此时将释放所有资源,这仅仅是因为进程正在退出。

    如果进程从未重新启动,只是泄漏句柄,垃圾收集器最终会将它们清理干净。但是,在发生这种情况之前,很可能会耗尽任何资源泄漏的句柄。这就是为什么在这些对象上调用Dispose()很重要(最好是通过“使用”模式),以便在应用程序处理完这些对象后立即释放资源,而不是在垃圾回收器处理完这些对象后立即释放资源。

        2
  •  1
  •   Randy Levy    17 年前

    连接池是数据库连接的缓存。应用程序池是一个(或多个)工作进程。因此,当您关闭应用程序池时,您将关闭工作进程并启动新的工作进程;这将导致池被破坏,连接池中的所有连接都被关闭。

    如果不在连接上调用close或dispose并依赖垃圾收集器,则连接可能会返回池,也可能不会返回池。我认为只有当连接仍然有效并且达到最大池大小时,才会将其添加回池。正如您可能知道的,您不应该依赖垃圾收集器来完成这项工作。确保释放连接的一个简单方法是使用将在代码块末尾自动调用Dispose的using语句。

    在ADO.NET 2.0中,有一些新方法可以以编程方式管理池:ClearAllPools和ClearPool。在修复所有数据访问代码之前,这可能会帮助您解决问题。