Чтобы стать более детерминированным, вы должны написать некоторые интеграционные тесты, чтобы проверить, где находится ваша память. Вы можете сделать это сейчас с 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);
}
}
}
так сколько пользователей вам нужно для достижения предела? – Limey
Я не понимаю вопроса. Изображения 1500x1500 пикселей, и все работает хорошо. С тем же кодом и теми же процедурами, если исходное разрешение изображения видеопотока составляет 3500x3500, тогда приложение вылетает с исключением памяти. Но компьютер имеет более 3 ГБ больше оперативной памяти и бесплатно. – Nasenbaer
Я бы пошел на профайлер _memory_ (т. Е. Не профилировщик _performance_), например [ANTI Memory Profiler] (http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/). –