最後の参照を保持しているのは SqlParameter であると確信できる場合、できることがいくつかあります。
最初に、XML を文字列として渡してみてください (そして、それを処理するために sproc で OPENXML を使用します) 単純なオブジェクトとより多くの制御が役立つかどうかを確認してください。
次に、独自の SqlParameter-s を作成し、辞書に保持してから、次のようにします。
foreach (SqlParameter param in parameters.Values)
command.Parameters.Add(param);
次に、コマンドの実行を終了してコマンドを破棄し、(まだ開いている場合は) 接続を閉じて接続を破棄し、辞書に移動して、null を SqlParameter.Value として明示的に割り当てます (または、文字列 ref を .Value からローカル変数に取得します)。 String.Empty を .Value に割り当ててから、null をローカル var に割り当てます。これは、SqlParameter.Value が単純な null について文句を言う場合のみです。次に、null を辞書項目 (これは SqlParameter への参照でした) に割り当て、次に null を辞書に割り当てます。
より単純なケースでは、その 1 つの重要な SqlParameter への参照のみを保持し、辞書をスキップできます。重要なポイントは、null を明示的に割り当て続けることです。つまり、最後の参照を文字列に割り当て、次にそれを含む SqlParameter の最後の参照に割り当てます。
いくつかのことが関係していることを覚えておいてください。中間層で XML をまったく解析しないことから始まります。XML を SQL に送信するだけで、明示的に参照を無効にすることで終わります。コードが実際にその場で XML を構築するようなものである場合は、1 つを大きなストレート文字列として作成してみてください。
これだけでメモリ負荷が下がらない場合は、明示的な GC コレクションを強制する必要がありますが、そのためには、GC のコストがかかるため、読み取りを少し行い、適切な間隔を計画する必要があります。つまり、リクエストごとに GC-in を開始する場合です。狂ったウサギのように、CPU サイクルで多額の費用を支払うことになります。
また、実際のデータの大きさや実行しているハードウェアの種類について言及していないため、中間層が IIS で実行されている場合、IIS で複数のワーカー プロセスを実行してリサイクルするなど、考えられるさらなるオプションについて推測するのは困難です。彼らが肥大化しすぎたとき。非常に大量のメモリ消費と真のパススルー中間層 (キャッシュの蓄積がないことを意味する) の場合、gc をいじるよりも高速ですが、その領域に入るために非常に巨大なデータについて話しています。