Comments 20
Согласен, статья исключительно для новичков. Мне она показалась довольно простой для восприятия, потому и решил перевести.
Есть еще прекрасная книга "Writing High-Performance .NET Code" by Ben Watson. Там довольно подробно расписана утилизация памяти, методы и средства диагностики проблем с памятью (и не только). Вроде как даже перевод на русский имеется.
Хорошая статья, только можно добавить почему именно поколений 3 и стадии сборки мусора. Но ещё может невнимательно читал, но не увидел, что в LOH объекты не сдвигаются.
Про то, что в LOH объекты не сдвигаются, тут есть. Про поколения и причину их разделения тоже есть, просто нет про то, что их именно 3. Но это перевод, так что даже не знаю, насколько этично будет что-то добавлять от себя.
А кстати, почему поколений именно 3?
Не отвечу на вопрос, но вообще например в Mono поколений 2. Думаю, что в дотнете просто решили, что два - маловато, а четыре уже не надо.)
Про то, что в LOH объекты не сдвигаются, тут есть.
Про LOH информация устарела. GC умеет "дефрагметировать" LOH. https://docs.microsoft.com/en-us/dotnet/api/system.runtime.gcsettings.largeobjectheapcompactionmode?view=net-6.0#System_Runtime_GCSettings_LargeObjectHeapCompactionMode
Лучше поздно, чем никогда)))) есть статья от Microsoft, где описывается почему именно 3 поколения, почему не меньше и не больше. В целом вся суть сводится к тому, что изначально планировалось использовать 2 поколения, но потом стало понятно, что слишком много "старых" объектов и решили ввести промежуточное поколение.
А есть ссылка? Я не находил.
Спасибо!
Скорее всего, это она, хоть про мотивацию и написано всего пара строк:
The reason for having three generations is that, in a well-tuned app,
most objects die in gen0. For example, in a server app, the allocations
associated with each request should die after the request is finished.
The in-flight allocation requests will make it into gen1 and die there.
Essentially, gen1 acts as a buffer between young object areas and
long-lived object areas.
Т.е. основные поколения - это нулевое, для коротко живущих объектов, и второе - для долго живущих. А первое - это своеобразный буфер между нулевым и вторым, чтобы случайно не поместить во второе поколение коротко живущие объекты, не успевшие умереть ко времени очередной сборки мусора.
Описание параллельного и непараллельного режима мутновато в переводе получилось. В английском варианте все понятно.
В оригинале сказано что серверный и десктопный это просто альтернативные названия параллельного и непаралельного. А в переводе говорится про "подрежимы". Непорядок.
Да, этот момент мне пришлось подредактировать, чтобы не вводить людей в заблуждение. На самом деле, параллельный и непараллельный режимы и десктопный и серверный режимы - это не два режима с разными названиями, а два режима (рабочей станции и серверный) и два подрежима - параллельный и непараллельный (то есть всего 4 комбинации, а не две). Так что там получилась небольшая смесь переводимой статьи и описания из Рихтера.
Введение в сборку мусора .NET