0

我正在尝试调试一些资源泄漏 - 特别是 oracle 连接。

在我的本地机器上,当我逐步执行 Page_Load() 时,我可以通过监视 v$session 查看在数据库中创建的连接。

一旦我走出 Page_Load,所有的连接都会关闭。

在开发服务器(W3k,IIS6)上运行的相同代码不会释放资源 - 根据 db 的连接仍然存在。

我在启用和不启用连接池的情况下都试过这个,它是一样的 - 在本地它很好,在它泄漏的服务器上。

我已经验证了两个地方的 .net 框架是相同的,并且代码也是相同的。我错过了什么?

4

2 回答 2

2

垃圾收集器具有三种不同的操作模式:Server GC、Workstation GC Concurrent 和 Workstation GC Non Concurrent。每个都以不同的方式运行,并针对不同类型的应用程序进行了优化。这可能是导致不同行为的原因。具体来说,行为可以根据是否存在单个或多个 CPU 来更改给定设置。查看Tess Ferrandez的博客以获得更详细的解释。

于 2009-06-15T22:21:29.393 回答
0

每当您在 .NET 中使用有限资源(如数据库连接)并期望资源被清理时,您应该在对象上显式调用 Dispose() 以确保它被正确清理和释放。

至于 Visual Studio 更改垃圾收集,我不明白为什么会这样。垃圾收集器的行为可能会有所不同,因为您在具有不同内存配置文件的不同机器上运行。您不能期望垃圾收集器以任何定义的方式运行,尤其是跨机器。但看起来你有一个更大的问题是没有正确处理你的数据库连接。

于 2009-06-15T21:28:07.463 回答