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

C#收集内存泄漏对象的垃圾,c#,memory-leaks,garbage-collection,C#,Memory Leaks,Garbage Collection,我使用的第三方对象不是我创建的,随着时间的推移会消耗大量资源。这个对象不应该以任何方式包含状态,它只是执行一个计算。尽管如此,每次我调用这个对象的特定函数时,会消耗更多的内存。几个小时后,我的程序被分配了千兆字节的内存 该对象最初初始化为命令行应用程序中程序类的静态成员。我发现,如果我将整个程序包装在一个类中,并时不时地对其重新初始化,则较旧(且臃肿)的对象将不被GC分配,而一个新的较小对象将替换它 我的问题是,这种方法非常笨拙,破坏了我的程序流程 有没有其他方法可以处理对象?我相信GC.Col

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

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

我的问题是,这种方法非常笨拙,破坏了我的程序流程

有没有其他方法可以处理对象?我相信GC.Collect()只会处理无法访问的代码。是否有任何方法可以使对象“无法访问”

编辑:根据要求,代码:

static ILexicon lexicon = new Lexicon();

字节相似性得分(字符串w1、字符串w2、部分语音位置、相似性度量)
{
如果(w1==w2)
返回255;
if(pos!=PartOfSpeech.Noun&&pos!=PartOfSpeech.Verb)
返回0;
IList w1_引理=词典。查找词条(w1,位置);
IList w2_引理=lexicon.FindSenses(w2,pos);
字节结果;
字节分数=0;
foreach(ILemma w1_引理在w1_引理中)
{
foreach(w2_引理中的ILemma w2_引理)
{
结果=(字节)(w1_引理.GetSimilarity(w2_引理,度量)*255);
如果(结果>分数)
分数=结果;
}
}
返回分数;
}

调用similarityScore时,会将更多内存分配给
词典
的私有成员。它没有实现IDisposable,也没有明显的清除内存的功能。该库基于WordNet,并使用一种算法在超名称树中查找路径长度,以计算两个单词的相似性。除非有缓存,否则我看不出它为什么需要存储任何内存。可以肯定的是,我不能改变它。我几乎可以肯定我的代码没有问题。当字典变得太大时,我只需要处理它(注意,从文件加载到内存需要一两秒钟)

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

如果该对象没有实现IDisposable,并且您想将其推出范围之外,您可以将对它的所有引用设置为null,然后使用GC.Collect()强制垃圾收集

GC.Collect()非常昂贵。如果你必须经常这样做,你可能会考虑联系供应商。 了解:

  • 如果您正确地使用了他们的库,或者您的错误导致了内存泄漏
  • 如果他们的库在按预期使用时仍在泄漏内存,他们能否修复泄漏

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

    我建议,如果你能使用内存分析器,你就可以使用它。内存分析器将允许您暂停程序,单击某个类,然后查看该类的对象列表。然后可以单击一个对象,查看它是如何创建的,以及从根到该对象的“路径”(例如,有一个静态类foo,它包含对条的引用,它包含对boz的引用,它包含对reallybighing的引用)。通常,看到这一点可以清楚地知道需要做什么来打破这个链条。

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

    对象是托管代码还是非托管代码?请咨询供应商并寻求帮助。可能只是您错误地使用了库,或者它确实存在内存泄漏问题。您可以在VS中插入断点并检查lexicon实例的私有变量吗?您可以帮助您的供应商找到错误并修复它。假设类实际实现了IDisposable或提供了一些释放本机资源的方法(也假设这是问题所在)。-1他没有提到实现IDisposable的对象。他也没有提到它没有实现IDisposable。关键是,假设它是一个潜在的解决方案,它不实现IDisposable。我将尝试将对象设置为null。我想我可以每五分钟运行一次GC.Collect(),现在我的应用程序根本无法长时间运行。图书馆是为一个非常利基的任务,是免费的,我怀疑我会得到任何与作者。谢谢
    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;
        }