Я новичок в .NET и CLR, просто вопрос по сборке мусора в CLR.
В моем учебнике описана одна из целей использования GC.Collect ():
Ваше приложение только что завершило выделение чрезвычайно большого количества объектов
и вы хотите удалить как можно большую часть полученной памяти.
Ниже мой код:
Console.WriteLine("Estimated bytes on heap: {0}", GC.GetTotalMemory(false));
Car refToMyCar = new Car();
Console.WriteLine("\nGeneration of refToMyCar is: {0}", GC.GetGeneration(refToMyCar));
GC.Collect(0, GCCollectionMode.Forced);
Console.WriteLine("\nGeneration of refToMyCar is: {0}", GC.GetGeneration(refToMyCar));
Console.WriteLine("Estimated bytes on heap: {0}", GC.GetTotalMemory(false));
и выход:
Estimated bytes on heap: 29900
Generation of refToMyCar is: 0
Generation of refToMyCar is: 1
Estimated bytes on heap: 39648
вот мой вопрос:
1 - GC.Collect (), кажется, отмечает только элемент, указанный refToMyCar от Поколения 0 до Поколения 1, ничто не было «свободным», так как Поколение 1 означает объект, который пережил сборку мусора. Скажем, перед GC.Collect () в куче осталось 10 МБ доступного размера (например, всего 100 МБ), а после GC.Collect () в куче осталось всего 10 МБ, так какой смысл вызывать GC .Collect ()? Разве мы не хотим, чтобы доступный размер был 100 МБ 100%?
EDIT:
Отменить мой предыдущий вопрос
если я изменю его на массив объектов, он будет еще более странным:
Console.WriteLine("Estimated bytes on heap: {0}", GC.GetTotalMemory(false));
object[] refToMyCar = new object[50000];
for (int i = 0; i < 50000; i++)
refToMyCar[i] = new object();
Console.WriteLine("\nGeneration of refToMyCar is: {0}", GC.GetGeneration(refToMyCar));
Console.WriteLine("Estimated bytes on heap: {0}", GC.GetTotalMemory(false));
вывод:
Estimated bytes on heap: 29900
Generation of refToMyCar is: 2
Estimated bytes on heap: 836140
Press any key to continue . . .
Почему refToMyCar - это Поколение 2, которое является объектом, пережившим более одного цикла сбора мусора? мы еще не вызывали неявный или явный GC.Collect ()?