大量的Byte []由StreamAsIStream实例保存在内存中

时间:2017-06-26 13:58:12

标签: c# .net wpf memory profiling

我一直在对C#.NET WPF应用程序进行内存分析,我发现有大量的Byte []实例留在内存中。它们主要由 StreamAsIStream 句柄实例保持活动,这些句柄引用System.IO.MemoryStream实例,最终引用System.Byte []实例。

enter image description here

这些System.Byte []实例的内存超过5mb,所以我想了解为什么他们会坐在记忆中,如果我有什么办法可以摆脱它们(除非它们是必要的,当然)。

enter image description here

我试图自己做一些研究,但我找不到多少。我见过的唯一一件事就是在WPF应用程序中托管WinForms元素时使用ElementHost,但整个程序中并没有使用ElementHost。

我能够在 SystemAsIStream 的构造函数中放置断点,并发现当我使用流创建新的BitmapImage实例时会实例化这些对象,但是即使在BitmapImage实例之后它们仍然存在GC'd。

我还使用WinDBG尝试检查 SystemAsIStream 实例,但我对使用该程序的经验不是很丰富。我能收集的最多的是实例是强有力的句柄,但我基本上已经知道了。

有没有人知道为什么会发生这种情况以及我能做些什么呢?关于StreamAsIStream的更多信息将不胜感激。

更多信息:我使用的是.NET 4.0,我的目标平台是x86。

编辑:使用以下代码创建BitmapImage实例:

    public static BitmapImage BitmapImageFrom(Stream stream)
    {
        BitmapImage image = new BitmapImage();
        image.BeginInit();
        image.CreateOptions = BitmapCreateOptions.None;
        image.StreamSource = stream;
        image.EndInit();

        return image;
    }

该流来自以下内容:

stream = Application.GetResourceStream(new Uri(string.Format(@"pack://application:,,,/Images/{0}/{1}", folder, imageName))).Stream;

我尝试通过将他们的CacheOption字段设置为BitmapCacheOption.OnLoad并处理流来创建BitmapImages,但这似乎没有什么区别(可能是错的 - 我可能做错了什么的)

0 个答案:

没有答案