[CLR] вопрос про GC

bastii

Немного подзабыл, поэтому вопросы.
Есть бит-массив "грязных" блоков кучи. Как он называется? Когда бит "грязности" блока сбрасывается?
Короче, нужно объяснить почему все ок со следующим примером.
Есть


class Node
{
public Node Ref;
public Node(Node Ref) { this.Ref = Ref; }
}


Есть статическое поле node.
Выполняется следующий код:


node = new Node(null); // объект 1
...
node = new Node(node); // объект 2
... // выполняется какой-то код, и оба объекта в Gen1, причем их адреса отличаюся на >128 байт
... // и они лежат в "чистых" блоках кучи
node.Ref.Ref = new Node(null); // объект 3
GC.Collect(0); // сборка мусора в Gen0 (не помню точно API)


Вопрос: почему объект 3 не удалится при этом?
В моем понимании объект 2 будет в "чистом" блоке и поэтому по время фазы, когда GC помечает доступные объекты, он не побежит с node на объект 2, т.е. объект 3 не будет помечен как доступный и будет удален.

bastii

Ладно, я сам разобрался, вернее нашел ту статью, где про это все написано
Garbage Collector Basics and Performance Hints
Просто все ссылки во всех объектах во всех "грязных" блоках кучи добавляюся в список корней, с которых GC начинает искать доступные объекты.

bastii

интересует подробная инфа про GC в Сановской VM
Оставить комментарий
Имя или ник:
Комментарий: