【发布时间】:2012-08-29 20:51:53
【问题描述】:
我注意到在分析我的程序时有很多 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 语句会处理字节,但由于它返回一个引用,这是否会推迟和/或放弃处理?
编辑:我添加了另一行代码。由于我将 uncompressedBtyes 存储在另一个对象中,将 uncompressedData 设置为 null 是没有意义的,并且只要 myObject(或直到 myObject.Bytes 设置为 null),byte[] 就会存在,对吗?
【问题讨论】:
-
using仅在您的代码中将非托管对象作为MemoryStream处理掉。bytes由 GC 进程管理,即在适当时收集垃圾(非确定性)。
标签: c# memory-management .net-4.0 memory-leaks using