我是否有严重的内存泄漏问题?

时间:2010-12-01 18:22:52

标签: c# performance forms memory-leaks memory-management

我正在C#中构建一个窗体应用程序,它从数百个文件中读取并创建一个对象层次结构。特别是:

DEBUG[14]: Imported 129 system/s, 6450 query/s, 6284293 document/s.

总和是我创建的对象的总数。顺便说一句,对象非常简单,只是一些int / string属性和里面强类型的列表。

问题:我的应用程序消耗大约700MB内存(在调试模式下)是正常的吗?如何减少内存使用量我该怎么办?

编辑:这就是为什么我有6284293个对象,如果你只是好奇的话。想象一下一个名为“系统”的搜索引擎。系统内部有更多查询。

public class System
{
  public List<Query> Queries;
}

每个查询对象都引用一个“主题”;这是主要论点(例如,搜索“意大利周末”)。它是一个检索到的文档列表:

public class Query
{
  public Topic Topic; // Maintain only a reference to the topic
  public List<RetrievedDocument> RetrievedDocuments;
  public System System; // Maintain only a reference to the system
}

每个检索到的文档都有一个分数和一个等级,并且引用了主题文档:

public class RetrievedDocument
{
  public string Id;
  public int Rank;
  public double Score;
  public Document Document;
}

每个主题都包含一系列内部相关或不相关的文档,以及对其主题的引用:

public class Topic
{
  public int Id;
  public List<Document> Documents;
  public List<Document> RelevantDocuments
  {
    get {return Documents.Where(d => d.IsRelevant());}
  }
}

public class Document
{
  public string Id;
  public bool IsRelevant;
  public Topic Topic; // Maintain only a reference to the topic
}

有129个系统,50个主要主题(129 * 50 = 6450个查询对象),每个查询具有不同数量的检索文档,总共6284293个。我需要这个层次结构来进行一些计算(平均精度,主题简易性,系统平均精度,相关性)。这就是TREC的工作原理......

3 个答案:

答案 0 :(得分:3)

如果您正在阅读6284293文档并在对象层次结构中保留这些文档,那么显然您的应用程序将使用相当数量的内存。鉴于我们不知道这些物体的大小,很难说你的使用是否超出预期。

另外,请记住CLR代表您的应用程序分配和释放内存。因此,即使您的应用程序已释放内存,也可能不会立即反映在进程的内存使用情况上。如果应用程序没有泄漏,则会在某些时候回收此内存,但您不应期望在进程内存使用中立即反映托管内存使用情况,因为CLR可能会保留内存以减少分配/释放的数量。

答案 1 :(得分:0)

scitech profiler(两周免费试用)并找出答案。

注意空列表,它们各占40个字节。

答案 2 :(得分:0)

如果不了解更多关于代码的信息,很难说清楚发生了什么,但这里有一些想法和建议:

  • 确保在完成阅读后关闭文件

  • 确保您没有维护对no对象的引用 更长时间的使用

  • 查看您正在使用的数据结构。有时,还有更多 以记忆效率的方式安排你的 数据

  • 查看您的数据类型,您使用的是Long还是Double 字节就够了吗?

  • 每个程序在调试模式下都会使用比非调试模式更多的内存, 但差异应该在 单个或10兆字节的顺序, 不是几百个。你能用任务吗? 经理检查内存多少 你在调试模式之外使用?