1

メインの接続オブジェクトがスコープ内にある限り、作成するすべてのオブジェクトへの参照を保持する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への参照を保持している別のオブジェクトがあるかどうかです。

4

1 に答える 1

0

私はいくつかの選択肢を考えることができます...

  1. 論理的に分割します。あなたはそれが「接続の期間中」すべての参照を保持すると述べました。10%を実行し、それを閉じ、新しいものを開き、その10%をスキップし、さらに10%(合計20%)を取ることができますか?
  2. ここで話しているのはどのくらいのメモリですか。このツールは長持ちするものになるのでしょうか。では、数分間大量のRAMを使用するとどうなるでしょうか。あなたは実際にOOMを手に入れていますか?プログラムで使用できるRAMがシステムに十分にある場合は、それを使用してみませんか?RAMの料金を支払いました。これは、100%のCPU消費についてのRaymondChenのブログ投稿の1つを思い出させます。
  3. 何かがガベージコレクションを妨げている理由を本当に知りたい場合は、SOSを起動して使用!gcrootすることから始めてください。

しかし、それにもかかわらず、これが本当に問題である場合、私はサードパーティのAPIプロバイダーとより多くの時間を費やします-ある時点で、サードパーティはこれを破るあなたが望むアップデートをリリースするかもしれません-そしてあなたは正方形に戻るでしょう、またはさらに悪いことに、製品に微妙なバグが発生する可能性があります。

于 2011-03-08T21:27:35.120 に答える