Сборка мусора в .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 часа.

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.

.NET mystery

В System.Linq.Enumerable стандартные функции имеют нестандартные имена.
- Aggregate вместо Fold
- Select вместо Map
- Where вместо Filter
- SelectMany вместо MapConcat
...

Это благие намерения или диверсия?

Deadly XML

Проверьте свой DOM парсер.


<!DOCTYPE foo [ 
<!ENTITY a "1234567890" > 
<!ENTITY b "&a;&a;&a;&a;&a;&a;&a;&a;" > 
<!ENTITY c "&b;&b;&b;&b;&b;&b;&b;&b;" > 
<!ENTITY d "&c;&c;&c;&c;&c;&c;&c;&c;" > 
<!ENTITY e "&d;&d;&d;&d;&d;&d;&d;&d;" > 
<!ENTITY f "&e;&e;&e;&e;&e;&e;&e;&e;" > 
<!ENTITY g "&f;&f;&f;&f;&f;&f;&f;&f;" > 
<!ENTITY h "&g;&g;&g;&g;&g;&g;&g;&g;" > 
<!ENTITY i "&h;&h;&h;&h;&h;&h;&h;&h;" > 
<!ENTITY j "&i;&i;&i;&i;&i;&i;&i;&i;" > 
<!ENTITY k "&j;&j;&j;&j;&j;&j;&j;&j;" > 
<!ENTITY l "&k;&k;&k;&k;&k;&k;&k;&k;" > 
<!ENTITY m "&l;&l;&l;&l;&l;&l;&l;&l;" > 
]> 

<foo>&m;</foo>