WPF Image source 内存泄露问题。

问题描述

我写了一个类继承Image类,这个Image需要在界面render的时候变化图片,其中变化的50张图片在类初始化的时候被初始化到数组privatereadonlyList<BitmapImage>_listOfImageSource=newList<BitmapImage()当界面render的时候我写了图片交替更新的代码如下publicvoidCompositionTarget_Rendering(objectsender,EventArgse){GC.Collect();GC.WaitForPendingFinalizers();if((_listOfImageSource.Count>0)&&_currentIamgeIndex<_listOfImageSource.Count){this.Source=null;this.Source=_listOfImageSource[_currentIamgeIndex];出现问题的地方}_currentIamgeIndex+=_stepInterval;if(_currentIamgeIndex>_listOfImageSource.Count)//stoptheanimmation{this.Visibility=Visibility.Hidden;_parentWindow.Visibility=Visibility.Hidden;this.Source=null;CompositionTarget.Rendering-=CompositionTarget_Rendering;}}经过测试发现上述代码里this.Source=_listOfImageSource[_currentIamgeIndex];是出现问题的地方,如果我让图片一直保持第一帧,似乎内存就不会暴增,但一旦改成变化的,内存就噌噌的网上增,即使动画结束也依然保持,请教各位大侠,如何要解决啊?尝试了好多办法,没用啊,无语了

解决方案

解决方案二:
能在描述细一些吗?涨的有多快,每次改变一次图片,都涨好几M吗?另外,楼主这50个图片,每个多大?
解决方案三:
引用1楼SPFarm的回复:

能在描述细一些吗?涨的有多快,每次改变一次图片,都涨好几M吗?另外,楼主这50个图片,每个多大?

从动画开始到动画结束内存从110M能涨到390M。因为图片是透明的png图片,有些图片就几K,但有些图片差不多要50K。没改一次都涨好几兆。
解决方案四:
是不是还没有到释放memory的时机呢。看看下面的讨论stillmemory-leaksin.net4-bindingmemoryBitmapImagetoImage-Source(这里面说550M时会开始释放)WPFBitmapImageMemory
解决方案五:
刚才还看了下msdn,BitmapImage没有实现IDisposable接口。
解决方案六:
不要看到内存涨了,就说内存泄露关键是什么时候涨的,涨了还会不会降回去你连续定义double[]d=newdouble[20000000];内存一样会暴涨的
解决方案七:
引用1楼SPFarm的回复:

能在描述细一些吗?涨的有多快,每次改变一次图片,都涨好几M吗?另外,楼主这50个图片,每个多大?

从动画开始到动画结束内存从110M能涨到390M。因为图片是透明的png图片,有些图片就几K,但有些图片差不多要50K。没改一次都涨好几兆。引用5楼Z65443344的回复:

不要看到内存涨了,就说内存泄露关键是什么时候涨的,涨了还会不会降回去你连续定义double[]d=newdouble[20000000];内存一样会暴涨的

不会回来啊,除非重启客户端。经过测试发现上述代码里this.Source=_listOfImageSource[_currentIamgeIndex];是出现问题的地方,如果我让图片一直保持第一帧,似乎内存就不会暴增,但一旦改成变化的,内存就噌噌的网上增,即使动画结束也依然保持,
解决方案八:
我用的是.net4.0,VS2010,我写了类似于楼主的代码,并没有出现内存暴涨的情况。不如楼主把代码择出来,弄成一个可以重现的小程序,发上来。大家也好拿回去试试。

时间: 2024-08-02 08:33:12

WPF Image source 内存泄露问题。的相关文章

记录由Equal基础知识引起的内存泄露

      在最近的公司框架开发中,利用了网上某大牛的反射缓存库作为辅助.在测试的时候发现出现了巨大的内存泄露,在频繁的操作后,内存不断的产生巨大的开销,10多分钟就占有了5,6m的内存.解决问题的时,公司不能上网,没有内存分析工具,没有我钟爱的ANTS Memory Profiler帮助下,我们只能靠简单的内存输出来二分查找缩小范围,利用 System.Diagnostics命名空间下的Process的WorkingSet64属性来统计两次输出的内存增长量(WorkingSet64:描述关联的

内存泄露-opencv运行时出现Exception at memory location

问题描述 opencv运行时出现Exception at memory location copy了一段模型匹配的代码,编译成功,但运行时出错 Unhandled exception at at 0x7543969B in canny.exe: Microsoft C++ exception: cv::Exception at memory location 0x0018F184. 内存泄露....不知道哪里出错了,大神们能帮帮忙吗?谢谢~ #include "stdafx.h" #i

(转)专项:Android 内存泄露实践分析

今天看到一篇关于Android 内存泄露实践分析的文章,感觉不错,讲的还算详细,mark到这里. 原文发表于:Testerhome: 作者:ycwdaaaa ;  原文链接:https://testerhome.com/topics/5822 定义 ​内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏.  内存泄漏形象的比喻是"操作系统可提供给

专项:Android 内存泄露实践分析

定义 内存泄漏也称作"存储渗漏",用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元.直到程序结束.(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏.   内存泄漏形象的比喻是"操作系统可提供给所有进程的存储空间正在被某个进程榨干",最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃.所以"内存泄漏"是从操作系统的角度来看的.这里的存储空间并不是指物理内存,而是指虚拟内存

如何用Java编写一段代码引发内存泄露

Q:刚才我参加了面试,面试官问我如何写出会发生内存泄露的Java代码.这个问题我一点思路都没有,好囧. A1:通过以下步骤可以很容易产生内存泄露(程序代码不能访问到某些对象,但是它们仍然保存在内存中): 应用程序创建一个长时间运行的线程(或者使用线程池,会更快地发生内存泄露). 线程通过某个类加载器(可以自定义)加载一个类. 该类分配了大块内存(比如new byte[1000000]),在某个静态变量存储一个强引用,然后在ThreadLocal中存储它自身的引用.分配额外的内存new byte[

Java技术专题之JVM你的内存泄露了吗?

一.从一个例子开始 关于JVM的内存泄露,让我们从下面一个例子开始吧,大家来判断一下如果按照下面这种分配方式,会不会出现内存泄露呢? import java.util.List; import java.util.Vector; public class MemoryTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Vector vobj

使用新版Android Studio检测内存泄露和性能

内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴. 怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的Android Studio 检测内存非常方便, 如果结合上MAT工具,LeakCanary插件,一切就变得so easy了. 熟悉Android Studio界面 工欲善其事,必先利其器.我们接下来先来熟悉下Android Studio的界面 一般分析内存泄露, 首先运行程序,打开日志控制台,有一个

Android 使用LeakCanary 检测内存泄露

转自:http://blog.csdn.net/sbsujjbcy/article/details/47999163 LeakCanary 是 Android 和 Java 内存泄露检测框架,该框架是Square公司的一个开源库,项目地址 leakcanary. Android 开发中你是否频频遇到内存泄露而无奈无从解决.说不定哪天你不小心写的一行代码就导致了内存泄露.可以先看看这些问题导致的内存泄露 Android开发编码规范导致的内存泄露问题,而LeakCanary 则很直白得检测出了内存泄

用java创建一个内存泄露的步骤?

问题: 我之前参加了一个面试, 被问到在java中如何创建一个内存泄露.不用说我当时不知道说啥,如何创建一个,我到现在也没有头绪.可以给我示范一个例子么? 回答: 有一个方式可以创建一个纯Java的内存泄露(运行代码中对象不可达,但仍然驻留在内存里) 1. 应用创建了一个长时间运行的线程(或者使用线程池,这会使内存泄露更快)2.线程从类加载器加载一个类3. 这个类分配一个大内存块(例如new byte[1000000]) ,把它通过强引用指向一个静态成员变量,然后把它自己的引用存储到Thread