В пятницу зашел разговор о том, как увидеть работу сборщика мусора в действии. Ну и под катом, небольшой пример на эту тему.
Для демонстрация, я буду пользоваться вот таким классом:
byte[] _data = new byte[1000];
}
Класс тривиален, он просто занимает в памяти место.
Для первой демонстрации создадим два раза по 500 тысяч таких объектов:
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ГБ.
Теперь, давайте, после инициализации первого массива почистим ссылку на него, вот так:
TestClass[] temp = new TestClass[500000];
for (int i = 0; i < temp.Length; i++)
{
temp[i] = new TestClass();
}
Console.WriteLine("Инициализирован первый массив");
Console.ReadKey();
temp = null;
Запускаем:
Как видно, объем используемой памяти соизмерим с объемом памяти после первой инициализации массива в предыдущем примере. Это и есть сборка мусора. Как только мы удалили ссылку на объект и запустили в массовом порядке создание новых объектов, он проснулся и высвободил память занимаемую объектами на которые не осталось ссылок, а у нас таких объектов был целый массив на 500МБ.
Собственно с примером все, да и на сегодня это тоже все.
Для демонстрация, я буду пользоваться вот таким классом:
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МБ.
Собственно с примером все, да и на сегодня это тоже все.
Комментариев нет:
Отправить комментарий