我有一个ImageList
,其中包含了你猜对了的图片。
这些图像作为Bitmap
加载到数据集的内存中。直到我把它们加载到ImageList
中,记忆的兴起并不担心。但是当他们被添加到ImageList
内存使用天空火箭时。
但最大的问题是我必须重新加载图像列表。我试图在列表中的每个图像上调用dispose但是内存没有被释放。
这是我试图清理内存的代码:
foreach (Image item in imageList.Images)
{
item.Dispose();
}
imageList.Images.Clear();
GC.Collect();
我做错了什么?
答案 0 :(得分:5)
您的处理代码不合适。迭代图像集合实际上为每个图像创建一个新的位图。然后你再次立即处置。只需调用Clear()。
GC.Collect()也没有任何影响,ImageList类是本机Windows组件的包装器。它将图像存储在本机内存中,而不是垃圾收集内存。
最后但并非最不重要的是您的真正问题:Windows内存管理器无法按您的想法运行。当它释放内存时,不会缩小程序的虚拟内存大小。它只是将内存块标记为未使用,并将其添加到空闲块列表中。准备好以后再使用。只有在极少数情况下,释放的内存恰好跨越整个保留内存页面集,才能缩小虚拟内存大小。这不是一个真正的问题。这是虚拟的。