Re[7]: GC в .NET
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 21.06.06 07:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Статистика памяти процесса сайта (процесс запущен 20.06.2006 в 19:01):



И еще, если не затруднит, такой же скриншот но в самую "жару".
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[8]: GC в .NET
От: fmiracle  
Дата: 21.06.06 07:45
Оценка: 6 (1)
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>И пара вопросов:

ANS>wtf is "Promoted memory" & "Promoted finalization-memory" ?
ANS>И не понятно почему сумма всех поколений не равна "Bytes in all heaps"

Если я правильно понимаю, то первое — это сколько памяти занимают объекты, в последний раз перешедшие из поколения в поколение (т.е. пережившие сборку), второе — сколько то же самое, но для объектов выживших в результате финализации (т.е. помеченных на удаление при сборке, но оставшихся живими из-за необходимости вызова Finalize для них).

Второе — "Bytes in all heaps" — сколько данных реально находится в кучах, а "heap X size" — сколько памяти выделено под кучу (в куче может быть еще никем не занятая, но заранее зарезервированная память — чтобы не запрашивать систему каждый раз о доп. памяти)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: GC в .NET
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 21.06.06 08:31
Оценка:
Здравствуйте, fmiracle, Вы писали:

ANS>>wtf is "Promoted memory" & "Promoted finalization-memory" ?


F>Если я правильно понимаю, то первое — это сколько памяти занимают объекты, в последний раз перешедшие из поколения в поколение (т.е. пережившие сборку), второе — сколько то же самое, но для объектов выживших в результате финализации (т.е. помеченных на удаление при сборке, но оставшихся живими из-за необходимости вызова Finalize для них).


Хм. имхо, 700K — большая цифра. Кто с кодом знаком, может прокомментировать (или подтвердить что цифра нормальная)?

И еще уточнение: "promoted" включает в себя "Promoted finalization" или их нужно суммировать?
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[10]: GC в .NET
От: fmiracle  
Дата: 21.06.06 10:18
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>>>wtf is "Promoted memory" & "Promoted finalization-memory" ?


F>>Если я правильно понимаю, то первое — это сколько памяти занимают объекты, в последний раз перешедшие из поколения в поколение (т.е. пережившие сборку), второе — сколько то же самое, но для объектов выживших в результате финализации (т.е. помеченных на удаление при сборке, но оставшихся живими из-за необходимости вызова Finalize для них).


ANS>Хм. имхо, 700K — большая цифра. Кто с кодом знаком, может прокомментировать (или подтвердить что цифра нормальная)?


Все относительно.
В целом — не такая уж и большая по сравнению с 3Гб что на сервере есть (т.е. 0.023% объема памяти), но горааздо больше чем ничего, да
Не забывай — объекты не насовсем выжили, а пережили одну сборку — со временим они удалятся. Хотя, конечно, лучше избегать их (применяя явный Dispose), но это не критично.

ANS>И еще уточнение: "promoted" включает в себя "Promoted finalization" или их нужно суммировать?


не знаю, самому интересно...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: GC в .NET
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 21.06.06 19:13
Оценка:
Здравствуйте, Чистяков Влад (VladD2 ), Вы писали:

ЧВV>Статья:

ЧВV>GC в .NET
Автор(ы): Чистяков Влад (VladD2)
Дата: 14.06.2006
Уже много сказано слов о том, что такое GC, чем он хорош и как лучше его применять. Но, наверно, очень многим хочется знать, как устроен конкретный GC. Данная статья открывает некоторые подробности устройчтва GC в .NET Framework.


ЧВV>Авторы:

ЧВV> Чистяков Влад (VladD2 )

Есть несколько комментариев по статье, которые появились при просмотре

1) COM+ Компоненты (ES) работают по умолчанию с включенным gcServer. Чтобы это проверить не обязательно использовать API. или через tasklist /m mscorsvr.dll (при активном COM+ комопненте мы получим dllhost.exe) или используя Process Explorer — в описании компонента будет указано что он в режиме gcServer

2) Порог срабатывания GC можно изменить, для этого есть IGCHost::SetGCStartupLimits
Re: GC в .NET
От: DuШes  
Дата: 22.06.06 08:46
Оценка: 5 (1)
Здравствуйте, Чистяков Влад (VladD2 ), Вы писали:

ЧВV>Статья:

ЧВV>GC в .NET
Автор(ы): Чистяков Влад (VladD2)
Дата: 14.06.2006
Уже много сказано слов о том, что такое GC, чем он хорош и как лучше его применять. Но, наверно, очень многим хочется знать, как устроен конкретный GC. Данная статья открывает некоторые подробности устройчтва GC в .NET Framework.


ЧВV>Авторы:

ЧВV> Чистяков Влад (VladD2 )

ЧВV>Аннотация:

ЧВV>Уже много сказано слов о том, что такое GC, чем он хорош и как лучше его применять. Но, наверно, очень многим хочется знать, как устроен конкретный GC. Данная статья открывает некоторые подробности устройcтва GC в .NET Framework.

Статья как и все статьи автора великолепна, всеобъемлюща, с доступными для понимания примерами, примерами кода, аналогиями...огромное спасибо.
Что касается работы с sos.dll, описания внутренного содержания и структуры объекта .net — в своем время очень понравилась статья и графические схемы к ней:
Внутреннее устройство .NET Framework — как CLR создает объекты периода выполнения
Re[2]: GC в .NET
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.06.06 22:54
Оценка:
Здравствуйте, <Аноним>, Вы писали:

ЧВV>>Статья:

ЧВV>>GC в .NET
Автор(ы): Чистяков Влад (VladD2)
Дата: 14.06.2006
Уже много сказано слов о том, что такое GC, чем он хорош и как лучше его применять. Но, наверно, очень многим хочется знать, как устроен конкретный GC. Данная статья открывает некоторые подробности устройчтва GC в .NET Framework.


А>что такое эфимерный?


Цитата из статьи:

GC .NET поддерживает три поколения 0, 1 и 2. Поколения 0 и 1 считаются эфемерными. Рождаясь, объекты попадаются в нулевое поколение. Большая их часть помирает, не дождавшись первой сборки мусора. Те из них, кто переживает первую в своей жизни сборку мусора, попадают в первое поколение. Первое поколение – это своего рода отстойник. Оно позволяет отфильтровать объекты, которые не успели умереть к моменту сборки мусора по чистой случайности. Второе поколение – это, можно сказать, дом престарелых. В нем доживают свой немалый век долгожители.

... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: GC в .NET
От: Аноним  
Дата: 23.06.06 06:45
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, <Аноним>, Вы писали:


ЧВV>>>Статья:

ЧВV>>>GC в .NET
Автор(ы): Чистяков Влад (VladD2)
Дата: 14.06.2006
Уже много сказано слов о том, что такое GC, чем он хорош и как лучше его применять. Но, наверно, очень многим хочется знать, как устроен конкретный GC. Данная статья открывает некоторые подробности устройчтва GC в .NET Framework.


А>>что такое эфимерный?


VD>Цитата из статьи:

VD>

GC .NET поддерживает три поколения 0, 1 и 2. Поколения 0 и 1 считаются эфемерными. Рождаясь, объекты попадаются в нулевое поколение. Большая их часть помирает, не дождавшись первой сборки мусора. Те из них, кто переживает первую в своей жизни сборку мусора, попадают в первое поколение. Первое поколение – это своего рода отстойник. Оно позволяет отфильтровать объекты, которые не успели умереть к моменту сборки мусора по чистой случайности. Второе поколение – это, можно сказать, дом престарелых. В нем доживают свой немалый век долгожители.


так все же что это значит?
и там эмиреными были обозваны не только поколения но и сегменты под кучи
Re[8]: GC в .NET
От: Rackshas  
Дата: 23.06.06 10:43
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:


VD>>
VD>>using System;
VD>>using System.Collections.Generic;
VD>>using System.Text;

VD>>class Program
VD>>{
VD>>    static void Main()
VD>>    {
VD>>        int bs = 1;

VD>>        try
VD>>        {
VD>>            while (bs > 0)
VD>>            {
VD>>                bs += 10; //для 1.1 без SP1 - лучше 10, для прочих - 100
VD>>                _array = null;
VD>>                _array = new byte[bs * 1024 * 1024]; // Занимаем!!!
VD>>            };

VD>>            Console.WriteLine("Усе ОК!");
VD>>        }
VD>>        catch (Exception ex)
VD>>        {
VD>>            Console.WriteLine(bs);
VD>>            Console.WriteLine(ex.Message);
VD>>        }
VD>>    }

VD>>    static byte[] _array;
VD>>}
VD>>


VD>>Этот вариант у меня показывает 1401.


N_P>1000 на 2.0

N_P>230 на 1.1 SP1
N_P>1.1 без SP под рукой нет, но там было-бы что-то типа 20.

N_P>Вопрос-то в чем ? То, что в 2.0 это поправлено — я знаю. Вопрос в том, что непонятно, как на 1.1 SP1 получается такой результат.


N_P>Возвращаясь к статье — не выходит описанной простоты. Явно ведь есть еще какой-то хитрый механизм.


Для эксперимента испытал этот код под JVM 1.5.0.06 — получил 61))
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: GC в .NET
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.06.06 18:26
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>так все же что это значит?

А>и там эмиреными были обозваны не только поколения но и сегменты под кучи

Эфемерные поколения размещаются в эфемерном сегменте. Соттвественно такой сегмент может быть только один. При заеме нового сегмента он автоматически становится эфемерным.
Само слово имеет значения:
1) мимолетный
2) недолговечный
3) скоропреходящий

Если это не понятно, то уточни что конкретно непонято.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: GC в .NET
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.06.06 21:26
Оценка:
Здравствуйте, Rackshas, Вы писали:

R>Для эксперимента испытал этот код под JVM 1.5.0.06 — получил 61))


В Яве размеры стэка и кучи ограничены некоторыми величинами. Для их увеличения нужно задавать параметры командной строки.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: GC в .NET
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.06 10:56
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>И еще, если не затруднит, такой же скриншот но в самую "жару".



... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: GC в .NET
От: WolfHound  
Дата: 08.07.06 15:01
Оценка:
Здравствуйте, VladD2, Вы писали:

ANS>>И еще, если не затруднит, такой же скриншот но в самую "жару".


[картинки выгрызины]
Я тихо фигею от колличества сборок второго поколения и особенно сильно от времени в ГЦ. 77.88 это что-то слишком много. На предыдущей картинке этот показатель был 4.01.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: GC в .NET
От: WolfHound  
Дата: 08.07.06 17:53
Оценка: +1 -1
Здравствуйте, Чистяков Влад (VladD2 ), Вы писали:

Я тут подумал насчет дефрагментации LOH. Ведь ее тоже можно делать причем довольно дешево.
Правда для этого придется немного покарежить ядро винды... нужно добавить функцию что-то типа VirtualMove которая позволяет переместить некий диапозон страниц с одних виртуальных адресов на другие.
Единственное что объекты LOH придется выравнивать на начало страници. При минимальном размере объекта LOH 85К и странице в 4К оверхед по памяти будет меньше 5%.
А в ОС типа сингулярити такое шаманство нужно делать в обязательном порядке.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: GC в .NET
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.07.06 00:37
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Я тихо фигею от колличества сборок второго поколения и особенно сильно от времени в ГЦ. 77.88 это что-то слишком много. На предыдущей картинке этот показатель был 4.01.


Сборок второго поколения вроде нормальное количество. А вот с временем в ЖЦ явный глюк. Так как буквально за минуту были доли процента. Видимо как раз попали на какую-то нехилую задержку.

А вообще, когда Перл отжирает память, то начинается задница. Надо с этим чудом что-то делать.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: GC в .NET
От: RredCat Украина http://rredcat.blogspot.com/
Дата: 20.08.07 17:22
Оценка:
Здравствуйте, Чистяков Влад (VladD2 ), Вы писали:

ЧВV>Статья:

ЧВV>GC в .NET
Автор(ы): Чистяков Влад (VladD2)
Дата: 14.06.2006
Уже много сказано слов о том, что такое GC, чем он хорош и как лучше его применять. Но, наверно, очень многим хочется знать, как устроен конкретный GC. Данная статья открывает некоторые подробности устройчтва GC в .NET Framework.


А вот пункт 1 заставляет GC задуматься. Ход его мыслей приблизительно следующий: «Ага! Надо проверить лимит второго поколения. Если он превышен, то собрать его. Если нет, то проверить лимит первого поколения. Если он превышен, то собрать первое поколение. Иначе собрать только нулевое поколение».


Да-да! Две секунды на тест с миллионом объектов и более 20 минут (!) на тест с 10 миллионами!!!
..........
Но почему-то наличие объектов во втором поколении постоянно подталкивает GC к сборке мусора во втором поколении.



А это не может быть случай — что обекты 2-го поколения поднимаются при постороении графа живых обектов? Или я не правильно представляю как получаются ссылки на обекты?
Re[2]: GC в .NET
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.08.07 12:36
Оценка:
Здравствуйте, RredCat, Вы писали:

RC>А это не может быть случай — что обекты 2-го поколения поднимаются при постороении графа живых обектов? Или я не правильно представляю как получаются ссылки на обекты?


Старые объекты должы попадать в первое и второе поколение и не должны учитываться при построеннии графа для нулевого поколения (и соотвественно втогое поколение не учитывается при сборе мусора в первом). Так что поднять их в память может только сборка второго поколения.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: GC в .NET
От: RredCat Украина http://rredcat.blogspot.com/
Дата: 21.08.07 12:59
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Старые объекты должы попадать в первое и второе поколение и не должны учитываться при построеннии графа для нулевого поколения (и соотвественно втогое поколение не учитывается при сборе мусора в первом). Так что поднять их в память может только сборка второго поколения.


Ясно. GC проверяет лиш лимиты..
Re[2]: GC в .NET
От: icWasya  
Дата: 08.10.12 11:10
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Чистяков Влад (VladD2 ), Вы писали:


WH>Я тут подумал насчет дефрагментации LOH. Ведь ее тоже можно делать причем довольно дешево.

WH>Правда для этого придется немного покарежить ядро винды... нужно добавить функцию что-то типа VirtualMove которая позволяет переместить некий диапозон страниц с одних виртуальных адресов на другие.
WH>Единственное что объекты LOH придется выравнивать на начало страници. При минимальном размере объекта LOH 85К и странице в 4К оверхед по памяти будет меньше 5%.
WH>А в ОС типа сингулярити такое шаманство нужно делать в обязательном порядке.

Весь вопрос в том, что при перемещении объекта нужно модифицировать все ссылки на него.
Re: GC в .NET
От: Аноним  
Дата: 09.10.12 11:00
Оценка:
Здравствуйте, Чистяков Влад (VladD2 ), Вы писали:

Круто! Хотя и с небольшим процентом неграмотности, как обычно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.