воскресенье, 14 апреля 2013 г.

Пример на сборку мусора

В пятницу зашел разговор о том, как увидеть работу сборщика мусора в действии. Ну и под катом, небольшой пример на эту тему.

Для демонстрация, я буду пользоваться вот таким классом:

class TestClass
{
    byte[] _data = new byte[1000];
}
Класс тривиален, он просто занимает в памяти место.
Для первой демонстрации создадим два раза по 500 тысяч таких объектов:

static void Main(string[] args)
{
    TestClass[] temp = new TestClass[500000];
    for (int i = 0; i < temp.Length; i++)
    {
        temp[i] = new TestClass();
    }
    Console.WriteLine("Инициализирован первый массив");
    Console.ReadKey();
    TestClass[] temp1 = new TestClass[500000];
    for (int i = 0; i < temp1.Length; i++)
    {
        temp1[i] = new TestClass();
    }
    Console.WriteLine("Инициализирован второй массив");
    Console.ReadKey();
}

После заполнения первого массива картина такая:
После второго:
Все логично. Создали миллион объектов по 1Б, вот программа и занимает в памяти 1ГБ.
Теперь, давайте, после инициализации первого массива почистим ссылку на него, вот так:

static void Main(string[] args)
{
    TestClass[] temp = new TestClass[500000];
    for (int i = 0; i < temp.Length; i++)
    {
        temp[i] = new TestClass();
    }
    Console.WriteLine("Инициализирован первый массив");
    Console.ReadKey();
    temp = null;

Запускаем:
Как видно, объем используемой памяти соизмерим с объемом памяти после первой инициализации массива в предыдущем примере. Это и есть сборка мусора. Как только мы удалили ссылку на объект и запустили в массовом порядке создание новых объектов, он проснулся и высвободил память занимаемую объектами на которые не осталось ссылок, а у нас таких объектов был целый массив на 500МБ.
Собственно с примером все, да и на сегодня это тоже все.
 

Комментариев нет:

Отправить комментарий