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

我正在用C#构建一个Windows窗体应用程序,该程序将从数百个文件中读取并创建对象层次结构.尤其是:

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的工作方式…

解决方法:

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

另外,请记住,CLR代表您的应用程序分配和释放内存.因此,即使您的应用程序释放了内存,这也可能不会立即反映在进程的内存使用中.如果应用程序没有泄漏,则此内存将在某个时候被回收,但是您不应该期望看到托管内存使用量立即反映在进程内存使用量中,因为CLR可能会保留在内存中以减少分配/释放的次数.

上一篇:Linux-阻止文件写入有什么好处


下一篇:MySQL查询性能-