【发布时间】:2010-05-27 19:27:29
【问题描述】:
我们有几个使用 ASP.NET 和 DevExpress ASPxGridView 组件的不同项目。在这些项目的整个开发过程中,已经使用了几种数据绑定技术,我们现在发现其中一些项目正在占用服务器上的所有内存。
最初,我们使用对存储过程的调用并将 DataSet 绑定到 gridview,但根据 DX 建议,将其修改为 ObjectDataSource 并创建最终使用 Linq 语句针对 DB 并返回泛型的对象然后绑定的对象列表。
不幸的是,这并不能解决当前的问题。我们仍然注意到大量的内存被吃掉了,我正试图弄清楚这一点。通过 RedGate 内存分析器运行时,我注意到每次重新绑定到网格时都会创建很多字符串、RuntimeTypeHandles 和我的对象实例。
DataBind 在页面加载时完成,网格在排序时使用回发,但这会导致 MB 的内存在每次绑定时泄漏,所以我想知道我可以使用哪些技术/最佳实践来管理我们的对象有控制权吗?我已经在数据对象中实现了 IDisposable,处理了 linq 上下文并将任何其他对象设置为 null,但这似乎没有什么不同。我似乎在每次调用时都创建了一个数据对象的实例,甚至调用 dispose 也没有什么区别。
【问题讨论】:
-
请描述“泄漏”。这些对象是否仍然可以通过某种方式到达?否则,这不是泄漏的情况,而是(过多)分配和 GC 上的负载。您是否分析了“# GC 集合”?
-
兆字节?那是一些网格...您是否正确使用分页?使用
LinqDataSource
应该很容易 -
您是否遇到内存不足异常或其他类型的内存问题?如果您将页面运行一百或一千次,内存最终会耗尽,还是会发生“坏事”?换句话说,内存使用真的有害还是正常?我使用 ASPxGridViews 并没有这个问题。
-
我仍在学习如何使用 Redgate 工具,所以我不能 100% 确定我所看到的是“泄漏”。我运行网页,让它加载。然后我拍了一张。我点击一列进行排序。我让它完成,然后拍了一张快照。快照比较显示,在快照 1 和 2 之间,我创建了 2 个额外的对象(我的 ObjectDataSource 附加到的对象)。当前活动实例显示为 3。我再次点击该列,当前活动实例显示为 4。有一个 Disposing 方法,每次都在 ObjectDataSource 上被命中,我在其中调用 Dispose。
-
实际问题是,当这个软件在实时服务器上运行时,它会占用内存,导致 OutOfMemory 异常。我查看了 LinqDataSource,但不知道如何将它绑定到除了单个 Linq 表之外的任何东西。
标签: c# asp.net memory-management