Почему GC.GetTotalMemory возвращает разные результаты? - PullRequest
3 голосов
/ 04 июля 2011

Когда я пробую этот код

public static void Main()
            {
                Console.WriteLine("Total bytes : " + GC.GetTotalMemory(true));

                Console.WriteLine("Total bytes : " + GC.GetTotalMemory(true));

                Console.WriteLine("Total bytes : " + GC.GetTotalMemory(true));

                Console.ReadKey();
            }

, я получаю эти результаты

enter image description here

Почему существует разница между первым и остальным результатом?1009 *

Ответы [ 2 ]

4 голосов
/ 04 июля 2011

Одной из причин этого может быть то, что ваш код переводится примерно так:

int totalMemory = GC.GetTotalMemory(true);
string s = "Total bytes : " + totalMemory;
Console.WriteLine(s);

Во второй строке приведенного выше кода класс String инициализируется, если это еще не было. Это означает, что его статические поля инициализируются, и вызывается его статический конструктор (если он есть). Затем вызывается метод Concat(), и все классы, необходимые для его выполнения, также инициализируются.

И в третьей строке класс Console инициализируется, если это еще не было. Затем, конечно, все классы, используемые во время выполнения WriteLine() тоже.

Все статические поля требуют некоторой памяти, поэтому они чувствуют, что когда вы звоните GC.GetTotalMemory() во второй раз, вы получаете несколько большее число.

1 голос
/ 04 июля 2011

Не уверен, но Console.WriteLine потребляет память ... Это происходит после одного обращения к нему, значение памяти не меняется.

Посмотрите на этот ответ, чтобы узнать подробности: Высокое использование памяти с Console.WriteLine ()

...