为了变得更具确定性,您应该编写一些集成测试来检查您的内存最终在哪里。您现在可以使用WMemoryProfiler来完成。我会首先加载 1500x1500 大小的图像,清理所有内容,然后将所有对象标记为已知。然后我会重新加载大图像并检查分配了哪些新对象,并仔细查看其中有多少以及谁拥有它们。
您说使用了许多外部模块。也许你应该因为不明智地使用内存而放弃其中的一些,并用更好的东西替换它们。现在你可以检查了。
如果您达到限制,您仍然可以卸载一些图像并按需加载它们,如果您和您的插件确实支持惰性结构,例如IEnumerable<Image>
您作为提供者可以决定何时加载图像以及将其保存在缓存中多长时间,直到您摆脱引用以帮助释放一些内存。
[Test]
public void InstanceTracking()
{
using (var dumper = new MemoryDumper()) // if you have problems use to see the debugger windows true,true))
{
TestWith1500x1500();
dumper.MarkCurrentObjects();
TestWith3000x3000();
ILookup<Type, object> newObjects = dumper.GetNewObjects()
.ToLookup( x => x.GetType() );
// here we do find out which objects are holding most of the memory
MemoryStatistics statOld = dumper.GetMemoryStatistics();
foreach (var typeInfo in statOld.ManagedHeapStats
.OrderByDescending(x => x.Value.Count))
{
Console.WriteLine("Type {0} has {1} instances of total size {2:N0} bytes",
typeInfo.Key,
typeInfo.Value.Count,
typeInfo.Value.TotalSize);
}
// then check with the info from above who is holding the most interesting new objects.
Console.WriteLine("New Strings:"); // just an example perhaps you should have a look at the images.
foreach (var newStr in newObjects[typeof(string)] )
{
Console.WriteLine("Str: {0}", newStr);
}
}
}