我注意到在分析我的程序时,有很多byte[]被卡在内存中。经过一番调查,我发现其中大部分实例是通过以下方式创建的:
public byte[] CreateBytes(byte[] bytes)
{
using (var start = new MemoryStream())
{
using (var memStr = new MemoryStream(bytes))
{
//do stuff
return start.ToArray();
}
}
}
返回的 byte[] 然后传递给其他方法,并在另一个 using 块内创建另一个 MemoryStream:
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吗?如果需要,应该在哪里设置?在第二个using块之后,我不再需要它了,但如果我只是放置
uncompressedData = null;
,我不确定这会释放内存。我本以为,在
CreateBytes(byte[] bytes)
的using语句中,会处理这些字节的处理,但既然它返回一个引用,那么是否推迟和/或放弃处理呢?
编辑:我添加了另一行代码。因为我正在将未压缩的字节存储在另一个对象中,所以将uncompressedData设置为null是没有意义的,byte[]数组将与myObject一样长时间存在(或直到myObject.Bytes设置为null),对吗?
using
只会处理非托管对象,例如MemoryStream
。而bytes
则由垃圾回收进程(非确定性)管理和清理。 - hIpPy