プログラムのプロファイリング中に、大量の byte[] がメモリ内で動かなくなっていることに気付きました。掘り下げたところ、次のような方法で作成されたインスタンスの大部分が見つかりました。
public byte[] CreateBytes(byte[] bytes)
{
using (var start = new MemoryStream())
{
using (var memStr = new MemoryStream(bytes))
{
//do stuff
return start.ToArray();
}
}
}
返された byte[] は他のメソッドに渡され、MemoryStream
別の using ブロック内から別のメソッドを作成する際に使用されます。
using (var uncompressedStream = new MemoryStream(uncompressedData))
{
using (var compressedStream = new MemoryStream())
{
//Do some compression
}
}
myObject.Bytes = uncompressedData;
uncompressedData = null;
return myObject;
(uncompressedData
は CreateBytes() から返される値です)。
私の質問は、byte[] がクリーンアップされるのはいつですか? 特にnullに設定する必要がありますか?もしそうなら、どこで? 2 番目の using ブロックの後、私はそれを必要としなくなりましたが、単純に言えば、それがuncompressedData = null;
メモリを再利用するかどうかはわかりません。
using ステートメントがバイトを破棄したと思っていましたCreateBytes(byte[] bytes)
が、参照を返しているため、破棄を延期および/または放棄しますか?
編集: 別のコード行を追加しました。uncompressedBtyes を別のオブジェクトに保存しているので、uncompressedData を null に設定しても無意味であり、byte[] はその限りmyObject
(またはmyObject.Bytes
null に設定されるまで) 存続します。正しいですか?