Mono GC в Linux: почему больше памяти занято, больше времени для GC и GetTotalMemory так дорого стоит? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть несколько игровых серверов, работающих на Linux-серверах, и начальный объем памяти, занимаемый каждым сервером, различен.

На каждом сервере я пишу несколько журналов производительности, например, для записи состояния сервера., "Сколько стоит один цикл", "Счетчик gc за один цикл".Таким образом, при работе в режиме ожидания размер памяти медленно группируется из-за выделения строки для журнала, что приводит к генерации 0 GC .

Когда я проверяю журналы состояния по прошествии нескольких часов, я нахожучто каждый раз, когда происходит GC, время цикла увеличивается, и я думаю, что это разумно.Но что я не понимаю, так это то, что увеличение времени цикла из-за GC отличается: чем больше памяти занимает время GC, тем больше увеличивается время цикла .Как показывает журнал: «Использование памяти 600 МБ занимает всего 1 мс , чтобы выполнить один ГХ 0-го поколения, но использование памяти 2 Г занимает 15 мс .один GC 0-го поколения!

Как я знаю, Mono использует GC Generation с двумя поколениями Nursery и Major, поэтому GC 0-го поколения требуется только для обработки части кучи питомника (барьеры записитехника), и в моей ситуации детская часть должна быть того же размера, который содержит вновь выделенные строковые объектыКто-нибудь может сказать почему?

Кроме того, когда я использую GC.GetTotalMemory (false) в моно, чтобы узнать, сколько памяти использует приложение, время цикла увеличивается примерно на 7-8 мс каждый раз,Я проверил код моно, но до сих пор не понимаю, почему.

1 Ответ

0 голосов
/ 05 марта 2019

Думаю, метка живых объектов будет стоить больше времени.Чем больше объектов в памяти, тем большее дерево нужно искать коллекционеру из корней.

...