我们注意到Visual Studio c#中的图像资源存在一个奇怪的行为。图像资源内存不足
如果您将图像添加到您的项目资源并多次加载图像,您将很快收到内存不足异常。
它只发生在某些系统上(在我测试的每台第二台PC上)。
重现:
- 创建Windows窗体项目
- 将图像添加到项目资源(32×32 PNG)
- 创建一个for循环与2000年环 在循环
填补图片从资源到私人列表
private List<image> _images = new List<image>(); private void ButtonClick(object sender, EventArgs e) { for (int i = 0; i < 2000; i++) { _images.Add(Properties.Resources.myImage); } }
每次运行循环时都会分配一些内存。 在一个健康的系统上,你可以做到这一点,直到你达到2GB(32位应用程序)。
但是在生病的系统上。该应用程序已经挂在200MB。
非常值得注意的是,一个sik系统不像一个健康的系统那样分配内存。 sik系统只在循环的一次执行中分配大约一半的内存。一个sik系统每个循环分配50MB。健康系统分配120MB。
系统完全一样。核心I7,Windows7,12GB内存,Visual Studio 2012. 在Windows8上,内存泄漏出现在每个测试系统上。
有没有人注意到同样的奇怪行为?
我们不可能提供帮助,除非您可以更加努力地确定健康系统*之间的*相似性*,生病系统之间的相似性*和这两者之间的差异*组。 –
如果你的循环做了'list.Add(image);',我怀疑只迭代1000次就已经占用了200MB,更不用说2GB了。毕竟,这些是*您正在添加到列表中的*引用。当然,没有**实际的**代码来分析,我只能说很多。 – Nolonar
@Nonolar:刚刚测试过,从资源获取图像实际上并不仅仅添加引用。它创建一个新的evey时间图像。 (从资源中添加两个图像后:'_images [0] == _images [1]'为false。做同样的事情,但首先将图像分配给变量'_images [0] == _images [1]'为真。) – TTT