带有许多字符串变量导致内存问题的类

时间:2011-10-04 16:08:06

标签: c# .net performance memory-management memory-leaks

背景: 我有一个2级A& B. A类包含1个int64,1个int,1个日期时间,6个字符串,1个字节[]和B类对象列表。

B类包含2个Int64,1个枚举(4个值),5个字符串。

A类和B类之间有一个主要的细节关系。 A类的列表中可以有0个或更多B类对象。

这些对象用于存储我们的数据库中的搜索结果。

我们有一个SOA架构。客户端可以使用特定日期范围和一组固定标准进行搜索。我们在服务上使用这些来收集搜索结果并将它们分批推送到客户端。发送每个批次后,我们从服务中删除这些对象。

问题: 如果用户进行的搜索返回200k结果(A类+ B类计数组合),则服务内存消耗将跳跃200mb。但是,如果后续搜索仅返回少量结果,则内存不会返回其先前的状态。当我查看服务的性能计数器时,我发现gen2对象占用了大量内存。

如果不尝试执行GC.Collect(),如何确保更快地返回该内存?我虽然在A类和B类上使用了IDisposable接口,但由于它们中的大多数字段都是字符串,我不知道如何强行处理它们。

2 个答案:

答案 0 :(得分:7)

您可能需要考虑从不同角度攻击问题。而不是试图优化垃圾收集细节等低级别的东西,为什么不退后一步,问你真的需要一次返回200k的结果吗?

如果在UI中显示这一点,那么显示200k结果对于人类来说完全没用,因为这太多了数据。我建议做一些分页,一次只显示100个(并且一次只从服务中检索100个)。或者可能向用户显示前100个,然后让他们点击按钮,如果他们真的想要检索所有200k。

这样的改进将比微优化内存管理产生更大的影响。

答案 1 :(得分:2)

即使您收集垃圾,我也不会认为该进程会将内存返回给操作系统。上次我看的时候,CLR采取的方法是,如果你曾经使用过那么多的内存,你可能会在以后再次使用它。

在大多数现代机器上,200MB并不是那么多 - 这绝对是一个真正的问题,还是更令人担忧?