Что может привести к сбою коллекции мусора C# так ужасно в моем приложении C#, где много вызовов C++, когда хорошо установленный GC.Collect разрешает проблему? Мое приложение C# делает миллионы вызовов C++, используя System.Runtime.InteropServices DllImport и CallingConvention.Cdecl, и имеет некоторые деструкторы C# для выпуска некоторой неуправляемой памяти C++. Я использую .NET Framework 4.Плохое автоматическое исполнение сборщика мусора C# со многими вызовами для взаимодействия с C++
Что может вызвать приведенный ниже код в моем приложении, чтобы заставить подкачки произойти замедление выполнения ползти (потребляющий 29GB оперативной памяти на моей системе 32 ГБ и с более 4 минут до того, как я убью этот процесс), просто изменив значение
ManualGC
наtrue
при использовании памяти с памятью около 600 МБ, и выполнение завершено в течение 29 секунд?Почему оставляя
ManualGC
false
и изменениеWrite
кtrue
использование памяти крышки около 12 ГБ и позволяет завершить выполнение примерно через 59 секунд без подкачки?
Отрывок некоторого кода в моем приложении (очевидно, с некоторыми названиями изменены):
private static int callCount = 0;
private const bool ManualGC = false;
private const bool Write = false;
internal static void CommonlyCalled()
{
++callCount;
if (callCount % 100000 == 0)
{
if (ManualGC)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
if (Write) Console.WriteLine(HandleErrorsCallCount);
}
DoLogic();
}
памяти измеряется с помощью "Память (Private Working Set)" колонку в диспетчере задач Windows. Поведение постоянно повторяемо.
Какая версия .Net? – Blorgbeard
Я использую .NET Framework 4 – JDiMatteo
Трудно узнать, не видя кода, который вызывает библиотеку C++. Можете ли вы создать классы оболочки C#, которые реализуют 'IDisposable' и очищают неуправляемый материал в' Dispose() '? –