繁体   English   中英

C#收集具有内存泄漏的对象的垃圾

[英]C# Collect garbage of object with memory leak

我使用的不是第三方对象,随着时间的推移,它会消耗大量资源。 该对象不应以任何方式包含状态,它只是执行计算。 尽管如此,每次我调用该对象的特定功能时,都会消耗更多的内存。 几个小时后,我的程序正坐在千兆字节的分配内存中。

最初,该对象已初始化为我的命令行应用程序中Program类的静态成员。 我发现,如果我将整个程序包装在一个类中,并不时地对其进行初始化,则GC不会分配旧的(膨胀的)对象,而新的较小的对象将替换它。

我的问题是这种方法很笨拙,并且破坏了我程序的流程。

还有其他处置对象的方法吗? 我相信GC.Collect()只会处理无法访问的代码。 无论如何,我可以使对象“无法到达”吗?

编辑:根据要求,代码:

static ILexicon lexicon = new Lexicon();

...

lexicon.LoadDataFromFile(@"lexicon.dat", null);

...

    byte similarityScore(string w1, string w2, PartOfSpeech pos, SimilarityMeasure measure)
    {
        if (w1 == w2)
            return 255;
        if (pos != PartOfSpeech.Noun && pos != PartOfSpeech.Verb)
            return 0;

        IList<ILemma> w1_lemmas = lexicon.FindSenses(w1, pos);
        IList<ILemma> w2_lemmas = lexicon.FindSenses(w2, pos);
        byte result;
        byte score = 0;

        foreach (ILemma w1_lemma in w1_lemmas)
        {
            foreach (ILemma w2_lemma in w2_lemmas)
            {
                result = (byte) (w1_lemma.GetSimilarity(w2_lemma, measure) * 255);
                if (result > score)
                    score = result;
            }
        }

        return score;
    }

调用lexiconlexicon更多内存分配给lexicon的私有成员。 它没有实现IDisposable,也没有明显的功能来清除内存。 该库基于WordNet,并使用一种算法在上标树中查找路径长度,以计算两个单词的相似度。 除非有缓存,否则我看不到为什么它需要存储任何内存。 可以肯定的是,我无法更改它。 我几乎可以肯定我的代码没有错。 我只需要在太大的情况下处理lexicon (注意,将词典从文件加载到内存需要花费一两秒钟的时间)

如果该对象未实现IDisposable,而您想将其推出范围,则可以将对其的所有引用都设置为null,然后使用GC.Collect()强制进行垃圾回收。

GC.Collect()非常昂贵。 如果您将不得不经常执行此操作,则可能需要考虑与供应商联系。

找出:

  1. 如果您正确使用了它们的库,或者您做错了什么,则导致内存泄漏。
  2. 如果即使按预期使用它们的库仍在泄漏内存,是否可以解决泄漏问题?

附加说明:如果第3方库是本机库,并且您必须使用互操作,则可以使用Marshal.ReleaseComObject释放非托管内存。

您可以尝试调用Dispose()方法。 这将使该对象不可用,因此您必须实例化另一个对象。 我假设您的程序处于循环中,因此它可以是一个循环变量,其调用位于底部。

我建议,如果可以使用内存分析器,则可以使用它。 内存分析器将使您暂停程序,单击一个类,然后查看该类的对象列表。 然后,可以单击一个对象并查看它是如何创建的,以及从根到该对象的“路径”(例如,有一个静态类foo,其中包含对bar的引用,其中包含对boz的引用,引用了一个非常重要的内容)。 通常,看到这一点将使您清楚需要做些什么来打破链条。

您可能可以从wordnet资源库下载源代码并修改代码,因为它是开源的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM