我正在处理一个 SDK,它保留对它创建的每个对象的引用,只要主连接对象在范围内。定期创建新的连接对象会导致其他资源问题,这不是一种选择。
为了做我需要做的事情,我必须遍历数千个这样的对象(将近 100,000 个),虽然我当然不会保留对这些对象的引用,但我正在使用的 SDK 中的对象模型会这样做。这会咀嚼内存并且危险地接近导致 OutOfMemoryExceptions。
这些对象存储在嵌套的 ReadOnlyCollections 中,所以我现在正在尝试使用反射将其中一些集合设置为空,当我完成它们时,垃圾收集器可以收集使用的内存。
foreach (Build build in builds)
{
BinaryFileCollection numBinaries = build.GetBinaries();
foreach (BinaryFile binary in numBinaries)
{
this.CoveredBlocks += binary.HitBlockCount;
this.TotalBlocks += binary.BlockCount;
this.CoveredArcs += binary.HitArcCount;
this.TotalArcs += binary.ArcCount;
if (binary.HitBlockCount > 0)
{
this.CoveredSourceFiles++;
}
this.TotalSourceFiles++;
foreach (Class coverageClass in binary.GetClasses())
{
if (coverageClass.HitBlockCount > 0)
{
this.CoveredClasses++;
}
this.TotalClasses++;
foreach (Function function in coverageClass.GetFunctions())
{
if (function.HitBlockCount > 0)
{
this.CoveredFunctions++;
}
this.TotalFunctions++;
}
}
FieldInfo fi = typeof(BinaryFile).GetField("classes", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(binary, null);
}
当我检查 numBinaries[0] 中的类成员的值时,它返回 null,这似乎完成了任务,但是当我运行此代码时,内存消耗只会不断上升,就像我不运行时一样快将类设置为 null 。
我想弄清楚的是这种方法是否存在本质上的缺陷,或者是否有另一个对象保留对我缺少的类 ReadOnlyCollection 的引用。