メインの接続オブジェクトがスコープ内にある限り、作成するすべてのオブジェクトへの参照を保持するSDKを扱っています。新しい接続オブジェクトを定期的に作成すると、他のリソースの問題が発生するため、オプションではありません。
必要なことを行うには、これらのオブジェクトの数千(約100,000)を反復処理する必要があります。これらのオブジェクトへの参照は確かに保持しませんが、使用しているSDKのオブジェクトモデルは反復します。これはメモリをかみ砕き、OutOfMemoryExceptionsを引き起こすのに危険なほど近づいています。
これらのオブジェクトはネストされたReadOnlyCollectionsに格納されるため、今試しているのは、リフレクションを使用して、これらのコレクションの一部をnullに設定し、ガベージコレクターが使用済みメモリを収集できるようにすることです。
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への参照を保持している別のオブジェクトがあるかどうかです。