Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC.
Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
Здравствуйте, Glas, Вы писали:
G>Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC. G>Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
Очень часто, только я не вмешиваюсь в его работу, а стараюсь понимать, где я оставляю мусор и в каком поколении он будет собран. По причине того, что если за этим не смотреть, то GC занимает много времени и убивает многопоточность. Даже в новых версиях, где стало гораздо лучше, всё равно надо следить.
Здравствуйте, Glas, Вы писали:
G>Всем привет.
G>Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC. G>Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
У меня инф-ия немного устаревшая, .net 3.5-4.0, но особо в работу gc вмешаться нельзя. Можно высказать свои пожелания, типа gc.collect, gc.waitforpendingfinalizers и т.д., но вот не факт, что сборка начнется тут же после этих команд. Сборщик мусора штука недетерминированная, у него свои эвристики, поэтому как будет на самом деле -. В последних версиях его сделали более ручным.
А так основные сценарии это когда начинается critical path в коде, или чувствительный к latency код, когда прерывания нашего кода крайне нежелательно (stop the world), перед этими участками кода и делают gc. У Клеппмана очень круто про это написано буквально на пару страниц.
Здравствуйте, Glas, Вы писали:
G>Всем привет.
G>Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC. G>Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
Дело не во вмешивании в GC, а в том, что у приложения могут быть нефункциональные баги, для предотвращения и исправления которых надо понимать, как работает GC
При работе с Com объектами их может плодиться кучи.
Конечно помогают Marshal.ReleaseComObject Marshal.FinalReleaseComObject(obj)
Но не всегда иногда приходится вызывать для полной очистки
GC.Collect();
GC.WaitForPendingFinalizers();
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Glas, Вы писали:
G>Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC. G>Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
Этот вопрос обычно не из-за того, что в эту работу надо вмешиваться, а для проверки насколько человек понимает работу среды, для которой пишет программу. Для младшего разработчика оно может быть и не особо важно, для старшего надо иметь уж хотя бы общее понимание.
При правильном подходе, в .net вполне можно устроить утечку памяти, когда разработчик думает, что она уже должна освободиться, а она не освобождается. Вот чтобы в подобное не вляпаться случайно и стоит иметь понимание его работы.
P.S.
Популярный вопрос про class/struct это ведь тоже на самом деле вопрос про GC (примерно все отвечают что класс-в куче, а структура — в стеке, но вот дальше, на что это повлияет-то, и вообще что есть "куча", а что "стек" отвечают уже не все, некоторые тут отвечают, что стек — это когда первым пришло, первым ушло...)
Здравствуйте, Glas, Вы писали:
G>Всем привет.
G>Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC. G>Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
Imho на вопросы с GC мастурбируют часто те, кто алгоритмы не осилил. Реально GC могут отключать, для гарантированного отклика, на бирже, например. Т.е. память никак не освобождается, а узел периодически перезагружается. Ну и памяти туда ставят щедро.
Здравствуйте, fmiracle, Вы писали:
F>Здравствуйте, Glas, Вы писали:
F>P.S. F>Популярный вопрос про class/struct это ведь тоже на самом деле вопрос про GC (примерно все отвечают что класс-в куче, а структура — в стеке, но вот дальше, на что это повлияет-то, и вообще что есть "куча", а что "стек" отвечают уже не все, некоторые тут отвечают, что стек — это когда первым пришло, первым ушло...)
В случае стека очистка бесплатна, указатели bp/sp переставил и всех делов. Локальность опять же лучше, cache oblivious и т.д.
Здравствуйте, Sharov, Вы писали:
S>У меня инф-ия немного устаревшая, .net 3.5-4.0, но особо в работу gc вмешаться нельзя. Можно высказать свои пожелания, типа gc.collect, gc.waitforpendingfinalizers и т.д., но вот не факт, что сборка начнется тут же после этих команд. Сборщик мусора штука недетерминированная, у него свои эвристики, поэтому как будет на самом деле -. В последних версиях его сделали более ручным.
S>А так основные сценарии это когда начинается critical path в коде, или чувствительный к latency код, когда прерывания нашего кода крайне нежелательно (stop the world), перед этими участками кода и делают gc. У Клеппмана очень круто про это написано буквально на пару страниц.
Ну вот я из памяти извлекаю инфу, что на msdn было написано — нежелательно ничего вызывать из GC. В предыдущем комменте меня натолкнули на мысль, что погуглить. Нашел на хабре статью про оптимизацию. Теперь понятно, о чем речь может идти. https://habr.com/ru/post/452298/
Здравствуйте, Тёмчик, Вы писали:
Тё>Здравствуйте, Glas, Вы писали:
G>>Всем привет.
G>>Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC. G>>Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
Тё>Imho на вопросы с GC мастурбируют часто те, кто алгоритмы не осилил. Реально GC могут отключать, для гарантированного отклика, на бирже, например. Т.е. память никак не освобождается, а узел периодически перезагружается. Ну и памяти туда ставят щедро.
Кто о чём, лысые — о расчёсках, а идиоты — о вопросах про алгоритмы на собеседованиях.
Здравствуйте, Glas, Вы писали:
G>Всем привет.
G>Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC. G>Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
В основном, такие вопросы призваны выявить понимает ли человек, какие есть варианты управления памятью в дотнетах.
Т.е. заход с GC всего лишь точка входа.
специфику его надо знать.
у нас например в питоне была проблема что приложение по работе зажирало через пару часов с терабайт оперативки. начали разбираться, оказалось если поменять сборщик мусора на кастомный jmalloc или как-то так, то там все оставалось в пределах гигов 20ти. то есть кто бы знал, что сборщик мусора питона 2.7 по крайней мере вообще никогда память не освобождает
Здравствуйте, Glas, Вы писали:
G>Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC.
Это святое. Причём нужно ответить так, как было написано в том учебнике, по которому обучался интервьюер.
G>Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
Крайне редко, бужу его, когда нужна немедленная чистка.
Здравствуйте, #John, Вы писали:
Тё>>Реально GC могут отключать, для гарантированного отклика, на бирже, например.
J>Как в .net отключить GC?
Хз. В JVM можно ключиками запуска указать, какую GC использовать. Есть такая, что ничего не освобождает, вот её используют для HFT.
Здравствуйте, __kot2, Вы писали:
__>у нас например в питоне была проблема что приложение по работе зажирало через пару часов с терабайт оперативки. начали разбираться, оказалось если поменять сборщик мусора на кастомный jmalloc или как-то так, то там все оставалось в пределах гигов 20ти. то есть кто бы знал, что сборщик мусора питона 2.7 по крайней мере вообще никогда память не освобождает
Раньше в скриптовых языках вроде питона и перла использовался счетчик ссылок, соответственно кольцевые ссылки не освобождались. Но это общая с C++ проблема. ХЗ как сейчас.
Здравствуйте, Glas, Вы писали:
G>Всем привет.
G>Недавно проходил несколько собеседований на .NET и частенько спрашивают про работу GC.
И правильно делают.
Потому что "разрабы", не понимающие работу GC ведут себя как обезъяны: едят там же где и гадят, и весь мусор бросают себе под ноги. Ну-а-чо, есть же GC, зачем думать о памяти?
В результате продуктами их жизнедеятельности должны заниматься более продвинутые коллеги. А оно им надо, быть уборщиками в зоопарке? G>Стало интересно, как часто вы вмешиваетесь в его работу и по каким причинам?
Вмешиваюсь редко, да там и возможность вмешательства весьма ограничена. Так, настроить чуток.
Но вот разгребать Авгиевы конюшни в поисках утечек — это да, бывает.
Здравствуйте, fmiracle, Вы писали:
F>P.S. F>Популярный вопрос про class/struct это ведь тоже на самом деле вопрос про GC (примерно все отвечают что класс-в куче, а структура — в стеке, но вот дальше, на что это повлияет-то, и вообще что есть "куча", а что "стек" отвечают уже не все, некоторые тут отвечают, что стек — это когда первым пришло, первым ушло...)
Здравствуйте, Sharov, Вы писали: S>А так основные сценарии это когда начинается critical path в коде, или чувствительный к latency код, когда прерывания нашего кода крайне нежелательно (stop the world), перед этими участками кода и делают gc. У Клеппмана очень круто про это написано буквально на пару страниц.
А можно ссылочку на Клеппмана?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sharov, Вы писали:
S>В случае стека очистка бесплатна, указатели bp/sp переставил и всех делов. Локальность опять же лучше, cache oblivious и т.д.
Там ещё много нюансов. Например, когда мы имеем структуру с несколькими полями, и работаем с ней локально (без передачи в/из виртуальных вызовов), то JIT вообще всё выкидывает примерно так, как если бы никакой структуры не было.
То есть ты пишешь там всякое про Point.x, Point.y, а джит всё это замапил на пару регистров (а то и вообще на один, если ты с .y не работаешь).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.