c# - 将字节数组转换为内存流和位图导致内存使用率高

标签 c# wpf memory-leaks out-of-memory heap-memory

我有一个字节数组列表。而且,我正在使用它通过内存流生成位图图像。

保存图像时,内存使用率非常高。在某些时候,它会导致内存不足异常。

我试图注释掉保存文件以查看是否会导致此问题。或者,手动调用 GC。什么都没有改变,仍然使用高内存。我最新的代码是这样的:

List<byte[]> byteArrayList = helper.GetArrayList(); // Gets approximately 10k items.

for (int i = 0; i < byteArrayList.Count; i++)
{
    using (MemoryStream ms = new MemoryStream(byteArrayList[i]))
    {
        using (Bitmap bm = new Bitmap(ms))
        {
            bm.Save(fileLocation);

            bm.Dispose();
        }

        ms.Dispose();
    }

    byteArrayList[i] = null;

    byteArrayList.Remove(byteArrayList[i]);
}

byteArrayList.Dispose();

我该如何解决这个问题?

最佳答案

我已经测试了您的代码,发现系统无法在循环中收集您的垃圾。因此,如果您在循环中创建如此多的位图,内存会增加到峰值水平(例如 2-3-4 gbs),直到垃圾收集器运行。但是当循环结束时,内存水平下降到正常水平,但为时已晚。因此,当我在 BACKGROUNDWORKER 而不是主线程中测试您的代码时,GC 不会卡在循环中并按预期运行,它将字节数组转换为位图并保存它们,而不会消耗任何大量内存。

关于c# - 将字节数组转换为内存流和位图导致内存使用率高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56871483/

相关文章:

c - 为什么这会引入内存泄漏?

c# - 如何获得使用audioSettings.dspTime传递的准确时间方法?

c# - 在 C# COM 中处理 NULL 指针输出参数

c# - 更改 Microsoft.Owin.Testing.TestServer 的 HttpClient 上的超时没有效果

c# - 将 System.Drawing.Points 加在一起

c# - 使用 Regex 的 DataValidation 不起作用

javascript - 我们是否需要手动清理闭包中未引用的变量?

c# - 如何在运行时更改类定义?

c# - 具有不同组合的 XAML 网格布局

c - C 中 strncpy 的内存混淆