На этом занятии мы узнаем, что такое сборщик мусора (garbage collector, gc) и он выполняет освобождение памяти, оберегая наши приложения от утечки. Узнаем, как выполняется сборка мусора (garbage collection), поколения (generation) объектов, а также придется чуть подробнее поговорить про ссылочные (reference type) и значимые (value type) типы, как они хранятся в памяти стека (stack) и управляемой кучи (heap). Изучим основные методы System.GC, такие как Collect, GetGeneration, GetTotalMemory и другие. Узнаем, что на самом деле делает оператор new. Кстати, меня зовут Вадим, и я программист на языке C# уже больше 8 лет. Рассказываю про IT технологии и веду этот курс по языку C# с нуля под названием Учим Шарп. В его рамках мы рассмотрим как базовый синтаксис языка C Sharp, так и его практическое применение и специальные технологии, такие как ASP.NET, Core, MVC, Unity, WCF, WPF, структуры данных и алгоритмы обработки, паттерны проектирования и многое другое. Для меня важно не только показать практическое применение языка C#, но и объяснить основную идею и базовые понятия Computer Science. Уроки c# выходят два раза в неделю в понедельник и четверг в 20-00 по МСК. Курс csharp рассчитан на то, чтобы изучить программирование с нуля. Разработка ведется в IDE Visual Studio. Подписывайтесь, впереди еще много интересного.
26:00, обьекты могут не сжиматься, алгоритм sweep, рассчитан на то, что если памяти достаточно, для размещения новых обьектов, то он будет использовать те очищенные и незанятые дырочки 27:00 о new, бесспорно, но к примеру структура тоже создается через new, но при этом располагается в стеке) 35:30 в куче есть списки свободных участков памяти, поэтому поиск их и занимает мин кол-во времени. Если ее не достаточно, gc выбежит сама
1:05:48 - Уважаемый, не в коем случае Я, "не умнечаю". Но для таких моментов, есть клёвая опция в Visual Studio, как "Профилировщик производительности" (Alt+F2). Там подробно можно посмотреть, как ваша программа грузит железо. Если Я конечно же не ошибаюсь) хорошего настроения, спасибо за видео) от меня 👍
Крайне тяжело слушать, начинается предложение - тут же появляется какой то вася с глупым комментарием и на него надо отвлечься и ответить, затем еще два слова предложения - появляется петя и пете надо ответить. Отвечать нужно конечно, но МОЖЕТ - на глупые и несущественные вопросы не отвечать вообще а на вопросы по делу отвечать после каких то блоков инофмарции?
Автор оговорился насчет размера больших объектов. Согласно документации майкрософта в большую кучу попадают объекты размером 85 000байт, т.е. 83Килобайта.
Здравствуйте. Подскажите, пожалуйста, каким образом стэк отделяется от кучи физически? За счет чего стэк быстрее? Просто за счет упорядоченности? И еще один вопрос. Значимые типы, которые объявляются внутри класса хранятся в стэке? Например С.Value. Понятно, что ссылка на класс есть в стэке, а где сама переменная Value? Спасибо
Stask и Heap. Оба этих хранилища находятся в оперативной памяти системы (RAM), но программно-аппаратный комплекс (процессор + операционная система + библиотеки .NET) работают с этими областями памяти по-разному. Cтек намного быстрее кучи. Причина в том, каким образом выделяется стек - простым назначением указателя стека (единственная команда ассемблера). В отличие от стека куча обслуживается программно, с помощью специальных вызовов API операционной системы или библиотек. Кроме того, при интенсивном использовании кучи некоторые языки, использующие автоматический сбор мусора (например, Java, C# .NET), могут вводить не прогнозируемые дополнительные задержки при выполнении кода в реальном времени.
На 40й минуте когда подводите итоги про поколения, правильно ли я понял: поколение 0 поколение 1 поколение 2 if(памяти не хватает) { вызывается Garbage Collection; foreach( делает проход по поколеню 0) { if(ссылка на объект есть) { объекту присваивается поколение 1; происходит фрагментация малых объектов; } else { ссылка на объект удаляется; } } if(памяти хватает) { GC прекращает работу; } else { foreach(делает проход по поколению 1) { if(ссылка на объект есть) { объекту присваивается поколение 2; происходит фрагментация малых объектов; } else { поколение объекта понижается на 1; снова GC делает проход по поколению 0; // с проверками // и если после всего этого памяти снова не хватает то тогда с поколение 2 происходит всё тоже что и с поколением 1 } } } }
На этом занятии мы узнаем, что такое сборщик мусора (garbage collector, gc) и он выполняет освобождение памяти, оберегая наши приложения от утечки. Узнаем, как выполняется сборка мусора (garbage collection), поколения (generation) объектов, а также придется чуть подробнее поговорить про ссылочные (reference type) и значимые (value type) типы, как они хранятся в памяти стека (stack) и управляемой кучи (heap). Изучим основные методы System.GC, такие как Collect, GetGeneration, GetTotalMemory и другие. Узнаем, что на самом деле делает оператор new.
Кстати, меня зовут Вадим, и я программист на языке C# уже больше 8 лет. Рассказываю про IT технологии и веду этот курс по языку C# с нуля под названием Учим Шарп. В его рамках мы рассмотрим как базовый синтаксис языка C Sharp, так и его практическое применение и специальные технологии, такие как ASP.NET, Core, MVC, Unity, WCF, WPF, структуры данных и алгоритмы обработки, паттерны проектирования и многое другое. Для меня важно не только показать практическое применение языка C#, но и объяснить основную идею и базовые понятия Computer Science. Уроки c# выходят два раза в неделю в понедельник и четверг в 20-00 по МСК. Курс csharp рассчитан на то, чтобы изучить программирование с нуля. Разработка ведется в IDE Visual Studio. Подписывайтесь, впереди еще много интересного.
Отдуши, бро. Смотрю в 23 году и всё равно доволен )
26:00, обьекты могут не сжиматься, алгоритм sweep, рассчитан на то, что если памяти достаточно, для размещения новых обьектов, то он будет использовать те очищенные и незанятые дырочки
27:00 о new, бесспорно, но к примеру структура тоже создается через new, но при этом располагается в стеке)
35:30 в куче есть списки свободных участков памяти, поэтому поиск их и занимает мин кол-во времени. Если ее не достаточно, gc выбежит сама
Отличный урок, большое спасибо!
Спасибо Сэр ! вы лучший!
Про собеседование очень интересно! Обязательно после курса и 2 интенсивов надо погуглить вопросы
Спасибо, очень доходчиво объяснено, что такое "ээээээ..." и когда его использовать.
В LOH обьекты попадают которые больше приблизительно 83 килобайт (>=85,000 bytes).
1:05:48 - Уважаемый, не в коем случае Я, "не умнечаю". Но для таких моментов, есть клёвая опция в Visual Studio, как "Профилировщик производительности" (Alt+F2). Там подробно можно посмотреть, как ваша программа грузит железо. Если Я конечно же не ошибаюсь) хорошего настроения, спасибо за видео) от меня 👍
41:04 вы хотели сказать, очищаются объекты первого поколения на которых нету ссылки, а остальные переходят во 2е поколение?
или все же объектам 1го поколения на которые не ссылаются
присваивается второе поколение ?
Крайне тяжело слушать, начинается предложение - тут же появляется какой то вася с глупым комментарием и на него надо отвлечься и ответить, затем еще два слова предложения - появляется петя и пете надо ответить. Отвечать нужно конечно, но МОЖЕТ - на глупые и несущественные вопросы не отвечать вообще а на вопросы по делу отвечать после каких то блоков инофмарции?
Автор оговорился насчет размера больших объектов. Согласно документации майкрософта в большую кучу попадают объекты размером 85 000байт, т.е. 83Килобайта.
я смелый человек готовый на собеседование) но не сейчас) через месяц полтора точно)
Бротишка, ты лучший, не хочешь попилить контент конкретно по. Net core?)
Если уже пилишь, то соре, не заметил, посмотрю ещё раз)
Кстати, про ресурсы для новичков, ещё habr есть, Microsoft dots(вроде так), и professor.web
Ты пытался создать свой яп?
В новых версия вижуалки, программа не останавливается, кстати.
Кстати инфа устарела про то, что приложение останавливается во время работы коллектора! На сколько мне известно, уже не останавливается
Да, работает в фоне
спасибо большое =)
Всегда пожалуйста )
Здравствуйте. Подскажите, пожалуйста, каким образом стэк отделяется от кучи физически? За счет чего стэк быстрее? Просто за счет упорядоченности?
И еще один вопрос. Значимые типы, которые объявляются внутри класса хранятся в стэке? Например С.Value. Понятно, что ссылка на класс есть в стэке, а где сама переменная Value? Спасибо
Stask и Heap. Оба этих хранилища находятся в оперативной памяти системы (RAM), но программно-аппаратный комплекс (процессор + операционная система + библиотеки .NET) работают с этими областями памяти по-разному. Cтек намного быстрее кучи. Причина в том, каким образом выделяется стек - простым назначением указателя стека (единственная команда ассемблера). В отличие от стека куча обслуживается программно, с помощью специальных вызовов API операционной системы или библиотек. Кроме того, при интенсивном использовании кучи некоторые языки, использующие автоматический сбор мусора (например, Java, C# .NET), могут вводить не прогнозируемые дополнительные задержки при выполнении кода в реальном времени.
Спасибо. Стало немного яснее)
Когда сказал "Йоу" - 25 лет
Если бы оно так работало...
Не помню рассказа про финализатор и интерфейс IDisposable в предыдущих уроках.
это отдельная тема на самом деле ) в CLR курсе эта тема будет рассматриваться подробно
Музыка отвлекает, особенно когда смотришь на 1.5
Извините но я так и не понял што делаэт диструктор (~) ???
Много трепа не по теме и отвлечений. Про стэк и хип начинал раз 10, прерывался на комменты, на что-то еще, в итоге за 10 минут не мог связать 2 слов.
Даа, отвлечения достали, но помогло х1.5 😂
Когда чел посмотрел первые 15 минут и сделал вывод по всей трансляции
++
На 40й минуте когда подводите итоги про поколения, правильно ли я понял:
поколение 0
поколение 1
поколение 2
if(памяти не хватает)
{
вызывается Garbage Collection;
foreach( делает проход по поколеню 0)
{
if(ссылка на объект есть)
{
объекту присваивается поколение 1;
происходит фрагментация малых объектов;
}
else
{
ссылка на объект удаляется;
}
}
if(памяти хватает)
{
GC прекращает работу;
}
else
{
foreach(делает проход по поколению 1)
{
if(ссылка на объект есть)
{
объекту присваивается поколение 2;
происходит фрагментация малых объектов;
}
else
{
поколение объекта понижается на 1;
снова GC делает проход по поколению 0;
// с проверками
// и если после всего этого памяти снова не хватает то тогда с поколение 2 происходит всё тоже что и с поколением 1
}
}
}
}
Не совсем. Поколение объекта не понижается. Упорядочивание объектов производится перед завершением работы сборщика мусора.
@@CODEBLOG спасибо за ответ!
Какой ты нудный. И постоянно теряешь тему.