c# - 保存位图时内存泄漏?

标签 c# image memory-leaks bitmap

我正在电脑上保存当前图片的截图:

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/

相关文章:

c# - 通过 ASP.NET 将 mpp 文件导入 SQL Server?

c# - 无法定位 Android 应用中内存泄漏的原因

android - 在Android中的逐帧动画中导致OutOfMemoryError

java - 常见的 Java 内存/引用泄漏模式?

java - C# 与 Java 的接口(interface)实现差异

c# - 我关于在循环中动态创建标签的代码不起作用,只出现一个

javascript - 通过 getJSON 从 .cshtml 调用 Controller

ruby - 如何仅在宽度超过 Graphics/Image Magick 时调整图像大小

jquery - 如何使用 jQuery 在 ASP.NET-MVC3 中动态加载图像

html - imagetoolbar 元标记和 IE 版本