Сборка мусора в .NET

Существует большое количество статей и даже книг, описывающих детали работы сборщика мусора в .NET. Все, что мне доводилось видеть, содержат искажения и значительные упрощения, выдаваемые за подробности реализации. Чтение таких материалов создаёт ложное чувство уверенности, в худшем случае люди даже начинают это спрашивать на собеседованиях. Они похожи на модель атома Бора, которая, вроде как, что-то и объясняет, но весьма далека от реальной жизни.

Примеры распространенных заблуждений, которые содержат долю правды, но не являются универсальной истиной:
1. После сборки мусора выжившие объекты всегда переходят в следующие поколение.
2. Выделение памяти на managed куче - это просто передвижение одного указателя, так как куча линейно растет в одном направлении.
3. Во время обхода кучи младший бит указателя на таблицу виртуальных функций используется для пометки живых объектов.
4. Максимальный размер N-го поколения равен X байт.

Rule of thumb: если что-то, касающееся .NET GC, кажется простым и логичным, это наверняка безумное упрощение.

На свете есть только два человека, кому можно верить относительно сборки мусора в .NET - Maoni Stephens и Patrick Dussud.
Все остальное - спекуляции.

P.S. Относительно достоверная информация доступна тут, но там мало подробностей:
http://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-33-CLR-GC-Part-1
http://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-34-CLR-GC-Part-2
http://blogs.msdn.com/b/maoni/
http://channel9.msdn.com/posts/Maoni-Stephens-CLR-45-Server-Background-GC
https://channel9.msdn.com/Shows/Going+Deep/Maoni-Stephens-and-Andrew-Pardoe-CLR-4-Inside-Background-GC

Зачем это вообще компилируется?

scala> var x:Option[String] = null
x: Option[String] = null

scala> for (v <- x) v
java.lang.NullPointerException


В Джаве почти все что угодно может быть null, в Скале решили "исправить ситуацию" добавив еще одну разновидность null-ов.

P.S.
Я теперь понимаю, о чем говорит это джентльмен.
http://www.youtube.com/watch?v=TS1lpKBMkgg

UPDATE
Опрос общественного мнения в Scala User Group показал, что практикующие программисты на Скале не считают это проблемой.
Tags:

LDAP

К своему стыду, только сейчас осознал, что LDAP - это NoSQL начала 90x.

Ну зачем???

Злой гений положил в 64х разрядный Windows 7, 2 версии Windows Media Player-а. И 32-х битная версия запускается по умолчанию. А я поставил 64х разрядные кодеки и тупил 2 часа.

Black .NET magic

Если нужно перехватывать вызовы к объекту, а сторонних AOP средств тащить не хочется, можно попробовать выкрутиться с помощью стандартного механизма проксей (transparent proxy and real proxy).
Но придется либо ограничиться вызовами через интерфейс, либо тип объекта должен наследовать MarshalByRefObject. Например, так работает WCF.

Готовый кодCollapse )
Tags:

TO BE DONE

Интересно, как повлияет на продуктивность переименование спика TO DO в TO BE DONE?

Git-овый code review tool моей мечты

Git позволяет сделать простой и легко интегрируемый в процесс разработки инструмент для code review.

Всего-то нужно:
Необходимые ингридиентыCollapse )

Вот и все! В подарок от Git-а идет:
1. База данные (не надо городить никаких SQL-лей). Репозиторий самодостаточен.
2. Синхронизация. Все разработчики получают коментарии автоматически.
3. Интергация с системой контроля версий. Самая лучшая из всех возможных - это часть системы контроля версий.

Вроде идея лежит на поверхности, ведь Git с саммого начала задумывался как CMS, а VCS - лишь одно из приложений.
Но никто пока ничего подобного вроде не сделал (даже Gerrit). Как там Линус в ядре code review делает?

P.S. Кстати вот эта (http://peepcode.com/products/git-internals-pdf) бумажечка за $9 - самый лучшей способ быстро и безболезненно понять как работает Git.
Tags:

DNS escape plan

Если у вашего провайдера отвалился DNS сервер, и нет никакой возможности нагуглить адрес публичного DNS-а, просто введите 8.8.8.8.

Не все хвостовые вызовы одинаково хвостовые

Похоже, что continuations сбивают с толку компилятор F# и он не может правильно расставить хвостовые вызовы.
Следующий код переполняет стек.

КодCollapse )

Согласно Reflector-у, там страшная каша в IL коде. Разве я хочу странного?
Tags: