Bitmap.Save,巨大的内存泄漏

2024-01-29

我有一个应用程序,我正在获取位图并使用 GZipStream 压缩它并通过套接字发送它,所有这些都在内存中。我已经将肮脏的渣男内存泄漏追踪到以下行:

frame.Save(inStream, jpegCodec, parameters);

浏览良好的信息高速公路,我发现了许多有关 Image 类在各种编解码器的 save 方法中泄漏内存的主题。问题是我实际上找不到任何修复方法。所以我的问题如下:

  1. 是什么原因造成的
  2. 我怎样才能解决这个问题

这是我的 FrameStream 类中泄漏所在的完整 Write() 方法。

/// <summary>
    /// Writes a frame to the stream
    /// </summary>
    /// <param name="frame">The frame to write</param>
    public void Write(Bitmap frame) {
        using (EncoderParameter qualityParameter = new EncoderParameter(Encoder.Quality, 50L)) {
            using (EncoderParameters parameters = new EncoderParameters(1)) {
                parameters.Param[0] = qualityParameter;

                ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
                ImageCodecInfo jpegCodec = null;

                foreach (ImageCodecInfo codec in codecs) {
                    if (codec.MimeType == "image/jpeg") {
                        jpegCodec = codec;
                        break;
                    }
                }

                using (MemoryStream inStream = new MemoryStream()) {
                    frame.Save(inStream, jpegCodec, parameters); // HUUUGE Memory Leak
                    Byte[] buffer = new Byte[inStream.Length];
                    inStream.Read(buffer, 0, buffer.Length);

                    using (MemoryStream outStream = new MemoryStream()) {
                        using (GZipStream gzipStream = new GZipStream(outStream, CompressionMode.Compress)) {
                            gzipStream.Write(buffer, 0, buffer.Length);
                        }

                        Byte[] frameData = outStream.ToArray();
                        Byte[] packet = new Byte[15 + frameData.Length];
                        Byte[] frameLength = BitConverter.GetBytes(frameData.Length);

                        Array.Copy(frameLength, 0, packet, 0, frameLength.Length);
                        Array.Copy(frameData, 0, packet, 15, frameData.Length);

                        m_Socket.Send(packet);
                    }
                }
            }
        }
    }

我建议在 CLR Profiler 下运行代码来定位泄漏源。如果它是任何类型的托管对象(甚至是非托管资源),只要错误不是由于托管类型泄漏非托管句柄造成的,您就能够看到泄漏在哪里。如果它在框架代码中,您可能可以使用反射和 P/Invoke 来解决它。

例如,IconWin32 类型泄漏HICON在某些情况下。解决此问题的方法是手动处置HICON通过 P 调用DeleteObject函数,使用暴露的句柄Icon.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bitmap.Save,巨大的内存泄漏 的相关文章

随机推荐

  • 使用 python requests 模块时发生 LocationValueError

    我一直使用 requests 包与网络交互 过去没有遇到任何问题 最近 当我使用一个大约一周没有使用的脚本时 我在执行例程时遇到了以下错误requests get call LocationValueError No host specif
  • 向 ASP MVC 操作添加基本身份验证

    我有一个 ASP MVC 应用程序 它使用它自己的自定义身份验证机制 但是 一个控制器中只有一项操作需要使用基本身份验证进行保护 这个想法是 当点击这个特定操作的 URL 时 浏览器会弹出基本身份验证对话框 然后我需要在操作本身中输入用户名
  • 无限的游戏背景

    我正在开发一个 Java 项目来模拟直升机在框架中的飞行 直升机使用箭头键在屏幕上移动 我希望直升机能够无限移动 即当直升机到达画面边缘时 背景应该向相反的方向移动 以具有无尽地形的效果 这是我到目前为止的代码 import java aw
  • C# 中服务器端文件大小的限制

    我目前正在 MVC4 中上传文件 但在我的控制器中 我尝试将文件大小限制为最大 4MB 但收到以下警告 comparison to integral constant is useless using Haacks http haacked
  • python Ghostscript不关闭输出文件

    我正在尝试将一页或多页的 PDF 文件转换为每页的图像 这很像在这里找到的问题 https stackoverflow com questions 331918 converting a pdf to a series of images
  • iOS 推送通知:找不到有效连接

    我正在尝试在本地解析服务器上设置推送通知 尝试发送推送时出现此错误 parse server push adapter APNS cannot find vaild connection for 9a86 21 每个安装设备令牌都会重复该错
  • 如何从 Ant 将参数传递给 Junit 测试?

    我在Ant下使用Junit执行Selenium测试 我的测试用例需要读取文件 其中包含测试数据 以完成数据驱动测试 我不介意在测试用例中嵌入文件名 但我想知道该文件所在的目录的名称 数据文件参数化存储在 build xml 文件中 将此类信
  • 从泛型函数中的枚举获取 rawValue

    2015 年 8 月 28 日更新 这将在 Swift 2 中得到解决 See Swift 编译器开发人员在 Twitter 上的回应 https twitter com evermeer status 636791736191320064
  • Arel:来自 Arel::SelectManager 的带有 join 的活动关系

    让我们有一个 Rails 4 2 x 应用程序 我们有两个表 posts 和authors 我们想使用 Arel 来获取由 name Karl 的作者撰写的帖子 在本例中 我们可以对 Active Record 连接感到满意 但这只是为了使
  • Azure 网站上的经典 ASP 网站,远程 mysql 数据库

    我已将一个经典的 asp 网站复制到新的 Azure 网站 并尝试让它连接到远程 MySQL 数据库 远程数据库未托管在 Azure 上 我收到一条内部服务器错误消息 详细日志似乎表明我的连接字符串存在问题 当前字符串设置如下 databa
  • WPF 应用程序仅是托管代码吗?

    我想在应用程序中使用 WPF 我想用C 写它 是否必须管理应用程序 我知道我可以将托管与非托管混合在一起 我想知道是否可以让整个应用程序不受管理 您可以轻松地使用非托管代码开发 99 的 WPF 应用程序 但使其 100 不受托管是相当困难
  • 如果字符串中的项目与列表中的项目匹配,则替换该项目

    我正在尝试从字符串中删除与列表匹配的单词 x How I Met Your Mother 7x17 HDTV LOL VTV Mon 20 Feb 2012 tags HDTV LOL VTV x264 DIMENSION XviD 720
  • CGImageSourceCreateWithURL 始终返回 NULL

    我需要在不加载或下载图像的情况下读取图像的属性 事实上 我已经实现了一个简单的方法 使用 CGImageSourceCreateWithUrl 来完成此任务 我的问题是它总是返回错误 因为似乎 imageSource 为空 那么我能做些什么
  • 有没有办法创建一个公共输出流对象以在控制台上打印并在 C++ 中打印到文件?

    我正在编写一个代码 必须在控制台上打印相同的数据并打印到文件中 有没有办法填充公共输出流对象 然后使用 cout 将其显示在控制台上 并使用 fstream 和 iostream 库将其导出到文件 当然 您只需创建一个合适的流缓冲区 它可能
  • 有没有办法为 Eclipse 工具提示添加延迟?

    我发现了本文 http eclipseone wordpress com 2010 08 24 configure tooltips in eclipse to only popup on request 关于使用 Shift 键在需要时弹
  • 膨胀类片段时出错

    我收到错误 Unable to start activity ComponentInfo de androidbuch activiti de androidbuch activiti task Activity android view
  • 无法运行 python-bluez RFCOMM 服务器示例脚本

    我正在尝试在我的 Android 应用程序和 Raspberry Pi 3 之间建立蓝牙通信链接 我尝试在我的 Raspberry Pi 上使用 pybluez 我的问题是 当我尝试运行 pybluez 附带的示例代码 见下文 时 我收到以
  • UIView 不透明属性

    The opaqueUIView 的属性默认情况下始终设置为 YES 但 UIView 类参考指出了这一点 不透明视图应该用完全不透明的内容填充其边界 即内容的 alpha 值应为 1 0 如果视图不透明并且未填充其边界或包含完全或部分透明
  • SQL Azure 中的 Code First 迁移 - 不支持没有聚集索引的表

    我似乎无法通过代码优先迁移来创建 SQL Azure 数据库 它一直抱怨 SQL Azure 缺乏对没有聚集索引的表的支持 而且我找不到创建数据库的方法 Note 我在用着CreateDatabaseIfNotExists在第一次创建数据库
  • Bitmap.Save,巨大的内存泄漏

    我有一个应用程序 我正在获取位图并使用 GZipStream 压缩它并通过套接字发送它 所有这些都在内存中 我已经将肮脏的渣男内存泄漏追踪到以下行 frame Save inStream jpegCodec parameters 浏览良好的