263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
|
||||||
1 | ||||||
А будет ли сборка мусора?15.04.2018, 11:43. Показов 615. Ответов 13
Всем привет!
Посмотрите внимательно на следующий код:
Не по теме: Для честности код не тестить. only for fans.
0
|
15.04.2018, 11:43 | |
Ответы с готовыми решениями:
13
Сборка мусора Сборка мусора Сборка мусора .NET Сборка мусора |
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
|
|
15.04.2018, 12:14 | 2 |
А что тут собирать то? Value type который вы на стэке создали? Собирать нечего, соответственно никакой сборки мусора не будет.
1
|
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
|
|
15.04.2018, 12:19 [ТС] | 3 |
0
|
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
|
|
15.04.2018, 12:29 | 4 |
Если там метод object.Equals(object obj), то конечно будет, ведь перечисление это значимый тип, и он будет упакован. Но только для 0 поколения, т.к. результирующие упакованные структуры никто не держит, и они не будут примерещатся на поколение выше.
1
|
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
|
|
15.04.2018, 12:34 [ТС] | 5 |
0
|
Anklav
|
15.04.2018, 12:37
#6
|
0
|
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
|
|
15.04.2018, 12:43 | 7 |
При вызове метода Equals происходит boxing значения enum-а, так что обьекты в куче будут создаваться.
Сборка мусора будет запущена, когда этих обьектов насобирается много, в соответствии с текущим GC memory threshold. В 99.99% случаев эти обьекты не переживут 0-е поколение и будут сразу собраны, т.к. ссылки на них существуют только при выполнении метода Equals. Если GC запущен во время выполнения метода Equals, то boxed обьект перейдет в поколение 1. Перейти в поколение 2 шансов нет. Сборка поколений 1, 2 будет происходить в соответствии с обычным регламентом (в поколение 2 попадет обьект args).
1
|
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
|
||||||
15.04.2018, 13:54 [ТС] | 8 | |||||
Добавлено через 38 минут То есть, боксим объект 1, боксим объект 2 и вызываем для них Equals .Если первый бокс влез в эфемерную кучу, а для второго места не хватило, то первый бокс перейдёт в поколение 1. Так? Похоже на то, что процент вероятности пережить сборку поколения 0 выше, чем 0.01%, потому что вот этот код тоже вызывает сборку для поколения 1:
Наверное, она в регистрах как-то сохраняется.
0
|
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
|
||||||
15.04.2018, 14:49 | 9 | |||||
Хм... первый не перейдет, т.к. на него уже нет ссылки (ввиду специфики кода в примере), а второй я думаю может перейти в поколение 1.
0
|
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
|
||||||
15.04.2018, 15:11 [ТС] | 10 | |||||
Этот код должен упасть после хотя бы одной сборки поколения 1. У меня это происходит при
count = 274903373 и Gen0 = 3222
0
|
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
|
|||||||||||
15.04.2018, 16:08 | 11 | ||||||||||
Уже понятнее, но как по мне методика вычисления непрозрачная.
Вот что получилось у меня, старался делать максимально приближенно к примеру:
Boxed object is in Gen 1 (on iteration 87358 (with probability of 0,001145 %)) Добавлено через 22 минуты new WeakReference тоже создают обьекты в куче, так что тест получился плохой. Обновленный тест, похоже obj никогда не попадает в Gen 1.
0
|
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
|
||||||
15.04.2018, 16:59 [ТС] | 12 | |||||
Но какие-то объекты всё равно проникают в поколение 1.
Это видно в средствах диагностики Visual Studio (оранжевая галочка появляется) или можно вставить блок проверки на основе if(GC.CollectionCount(1) > 0) вцикл. Исключение появится там же, где и галочка. Добавлено через 35 минут nicolas2008, вот попытался вынести боксинг из цикла, чтоб не инлайнился. Но результат всё тот же: поколение 1 наполняется непонятно какими объектами. А "свежеупакованное" значение всегда в поколении 0.
в принципе невозможно.
0
|
1144 / 853 / 262
Регистрация: 30.04.2009
Сообщений: 3,581
|
|
15.04.2018, 17:19 | 13 |
Какие то проникают, но я думаю что это другие обьекти, пока не доказано обратное
Сделай Performance Profiler-ом Memory Snapshot и увидишь, что там куча разных системных обьектов.
0
|
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
|
|
15.04.2018, 17:22 | 14 |
Так а вы думаете что кроме ваших объектов там больше ничего нету?
Там же куча статических ссылок, да тот же AppDomain и Thread. Я думаю время от времени сборщик мусора все же обязан убирать в остальных поколениях, даже если они не достигли предела. Хотя бы для того, что бы более менее вовремя вызывать финализаторы.
0
|
15.04.2018, 17:22 | |
15.04.2018, 17:22 | |
Помогаю со студенческими работами здесь
14
Сборка мусора Сборка мусора Сборка мусора Сборка мусора вручную Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |