почему так много?
static void Main(string[] args)
{
Console.WriteLine(GC.GetTotalMemory(false));
string str = string.Empty;
Console.WriteLine(GC.GetTotalMemory(false));
}
результат:
29556
37748
Здравствуйте, -rsdn-, Вы писали:
static void Main(string[] args)
{
Console.WriteLine(GC.GetTotalMemory(false));
Console.WriteLine(GC.GetTotalMemory(false));
string str = string.Empty;
Console.WriteLine(GC.GetTotalMemory(false));
}
29556
37748
37748
Здравствуйте, -rsdn-, Вы писали:
R>почему так много?
R>R> static void Main(string[] args)
R> {
R> Console.WriteLine(GC.GetTotalMemory(false));
R> string str = string.Empty;
R> Console.WriteLine(GC.GetTotalMemory(false));
R> }
R>
R>результат:
R>29556
R>37748
Это потому что вы str объявили как string. Объявите как var — сразу станет меньше.
Здравствуйте, -rsdn-, Вы писали:
R>почему так много?
R>R> static void Main(string[] args)
R> {
R> Console.WriteLine(GC.GetTotalMemory(false));
R> string str = string.Empty;
R> Console.WriteLine(GC.GetTotalMemory(false));
R> }
R>
R>результат:
R>29556
R>37748
Узнаю, узнаю брата Сеню! О, сколько крови было пролито при
боях измерениях размера пустого Delphi-экзешника
А теперь к теме. Вычитаем: 37748 — 29556 = 8192, т.е. ровно 8 килобайт. А это — две дефолтные 4К-страницы (если память не изменяет) мэппинга физической памяти на виртуальную. Т.е. процесс по каким-то своим собственным причинам частицу памяти строго более 4 килобайт но менее либо равную 8 килобайт. В ответ ему выдали две страницы (в силу гранулярности).
Мораль: единичные измерения плохи для статисследований — шумовых искажений over9000. Сделайте хотя бы сотню стрингов и разделите полученную дельту Total Memory на сотню — честнее будет.
Здравствуйте, -rsdn-, Вы писали:
R>почему так много?
Твой код меряет потребление памяти под внутренние нужды GC, они необязательно будут сопоставимы с размером выделенной под строку памяти.
Если в generation heap достаточно места, то получим что-то типа
37748
37748
(у тебя во втором примере так и получается)
Если недостаточно — рантайм аллоцирует дополнительную память. Точное поведение: когда, как и сколько — это детали реализации, они могут поменяться в произвольный момент времени.
На хабрахабре есть две на удивление неплохие вводные статьи по внутренностям строк и stringbuilder, советую прочитать, большая часть вопросов должна отпасть:
http://habrahabr.ru/post/172627/
http://habrahabr.ru/post/172689/
Чтобы снизить влияние накладных расходов при измерении нужно, как минимум, вызвать принудительную сборку GC через .GetTotalMemory(true) и считать объём не на единичных аллокациях. Пример можно подсмотреть
тут.
Если хочется больше подробностей — см
http://www.codeproject.com/Articles/3377/Strings-UNDOCUMENTED (о состоянии дел до CLR 4)
http://blogs.msdn.com/b/calvin_hsia/archive/2012/07/19/10331822.aspx и
http://stackoverflow.com/questions/5240971/where-does-net-place-the-string-value — о том, как проверить самому.