【发布时间】:2011-02-22 03:13:32
【问题描述】:
我正在使用我没有创建的第 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 的私有成员分配更多内存。它没有实现 IDisposable,也没有明显的清除内存的功能。该库基于 WordNet,并使用一种算法在上位词树中查找路径长度来计算两个单词的相似度。除非有缓存,否则我看不出它为什么需要存储任何内存。可以肯定的是,我无法改变它。我几乎可以肯定我的代码没有任何问题。我只需要在 lexicon 变得太大时处理它(注意,将词典从文件加载到内存需要一两秒钟)
【问题讨论】:
-
对象是托管代码还是非托管代码?
-
咨询供应商并寻求帮助。可能只是您错误地使用了该库,或者它确实存在内存泄漏问题。
-
能否在VS中插入断点并检查词典实例的私有变量?您也许可以帮助您的供应商找到错误并修复它。
标签: c# memory-leaks garbage-collection