我正在电脑上保存当前图片的截图:
Rectangle bounds = Screen.GetBounds(Point.Empty);
using (var bitmap = new Bitmap(bounds.Width, bounds.Height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
}
using (var mss = new MemoryStream())
{
bitmap.Save(mss,ImageFormat.Gif);
}
}
内存泄漏是在这段代码中:
bitmap.Save(mss,ImageFormat.Gif);
我对 using
的使用不应该处理我正在使用的所有内容吗?
为什么在拍摄大量照片时内存使用率仍然很高,而且内存没有释放回来?
谢谢!
最佳答案
您可能会看到我在询问 this question on SO. 时遇到的相同问题
在我的案例中,问题是 MemoryStream
没有释放其内部 byte[]
,即使在其上调用 Dispose
也是如此。在 MemoryStream
超出范围并被 GC 收集之前,byte[]
不会被释放。
This blog post详细说明了问题的原因,并提供了 a working solution.它对我有用,我怀疑你遇到了同样的问题。本质上,它将底层 MemoryStream
包装在实现相同接口(interface)的类型中,但在调用 Dispose()
时将流引用设置为 null。由于没有其他对象应该有对内部流的实时引用,这允许 GC 突袭并清理它。
此外,这个问题因内部 byte[]
可能会分配到大对象堆上而变得更加复杂,这会导致多次分配后出现碎片。
关于c# - 保存位图时内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6417299/