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

  显示原文与译文双语对照的内容
0 0

我使用的是一个 3党的对象我没有创建的东西消耗了大量的资源。 这里对象不应该以任何方式包含状态,它只是执行计算。 尽管如此,每次我调用这个对象的特定函数时,都会消耗一些内存。 几个小时后,我的程序就处于allocated内存。

对象是origionaly初始化为我的命令行应用程序中的程序类的static 成员。 我发现,如果我把整个程序包装在一个类中,并且每次重新初始化它,老的( 臃肿) 对象就会被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 成员分配更多内存。 它实现了 NOT 并没有明显的函数来清除内存。 库基于 WordNet,使用一种算法在hypernym树中查找路径长度,计算两个单词的相似度。 除非有缓存,我无法知道为什么需要存储任何内存。 当然,我不能改变它。 我几乎确定我的代码没有什么问题。 当 lexicon 太大时,我只需要处理它( n 。 从文件加载词典到内存需要一两秒的时间

时间: 原作者:

0 0

如果对象未实现 IDisposable,并且你希望将它的推出范围,则可以将所有对它的引用设置为空,然后将强制垃圾回收与 GC.Collect() 一起使用。

GC.Collect() 非常昂贵如果你要经常执行这里操作,你可能需要考虑与供应商联系。

查找:

  1. 如果你正确地使用了它们的库,或者你正在做的一些错误导致内存泄漏。
  2. 如果他们的库在按预期的方式使用内存时也会泄漏内存,他们可以修复漏洞?

另外注意:如果 3rd 方库是本地的,并且你必须使用互操作,那么你可以使用 Marshal.ReleaseComObject 来释放非托管内存。

0 0

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

原作者:
0 0

我建议如果你能把你的手放在一个记忆分析器上,你可以使用它。 内存分析器可以让你暂停程序,单击一个类,并查看该类的对象的List 。 一个可以点击创建一个对象,看看它,和"路径"从 root ( 比如 该对象。 有一个 static 类 foo,它持有一个对bar的引用,它保存了对boz的引用,它包含对reallybigthing的引用) 。 经常看到,这将使它清楚地指出需要做什么来打破链。

原作者:
0 0

你可能能够从wordnet存储库下载源代码并修改代码,因为它是一个开源代码。

...