CG.Collect не работает в моем большом приложении, но отлично работает в небольшом проекте - PullRequest
0 голосов
/ 16 апреля 2020

Когда я помещаю этот код в небольшой консольный проект:

Console.WriteLine($"Mémoire avant allocation 1G: {GC.GetTotalMemory(false)}");

byte[] buf = new byte[1000000000];

Console.WriteLine($"Mémoire après allocation 1G: {GC.GetTotalMemory(false)}");

buf = null;

GC.Collect();

GC.WaitForPendingFinalizers();

GC.Collect();

Console.WriteLine($"Mémoire après libération 1G: {GC.GetTotalMemory(false)}");

, я получаю следующий результат (как и ожидалось):

  Mémoire avant allocation 1G: 30028

  Mémoire après allocation 1G: 1000038252

  Mémoire après libération 1G: 29472

Теперь В том же коде большого приложения, над которым я работаю, я получаю следующий результат:

Mémoire avant allocation 1G: 153152496

Mémoire après allocation 1G: 1153152552

Mémoire après libération 1G: 1146813960

Как видите, GC.Collect здесь ничего не делает.

Почему это?

1 Ответ

0 голосов
/ 16 апреля 2020

Попробуйте сжать LOH

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect( );

Также обратите внимание, что в документации, описывающей GC.Collect( ), всегда используется слово "try" или "try".

Пример (выделено мной):

Используйте этот метод, чтобы попытаться , чтобы восстановить всю память, которая недоступна. Он выполняет блокировку сборки мусора всех поколений.

Все объекты, независимо от того, сколько времени они находились в памяти, считаются для сбора; однако объекты, на которые есть ссылки в управляемом коде, не собираются. Используйте этот метод, чтобы заставить систему попытаться , чтобы восстановить максимальный объем доступной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...