gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:22:07 25 4
gpt4 key购买 nike

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

该对象在我的命令行应用程序中最初被初始化为我的 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;
}

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

最佳答案

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

GC.Collect() 非常昂贵。如果您不得不经常这样做,您可能需要考虑联系供应商。

找出:

  1. 如果您正确使用了他们的库,或者是您做错了什么导致了内存泄漏。
  2. 如果他们的库即使按预期使用也会泄漏内存,他们能修复泄漏吗?

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

关于C# 收集内存泄漏对象的垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5073627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com